Эквивалентный из “копии Firebug XPath” в Internet Explorer?

Псевдокод:

    NumberToBits(int x) {
    var answer = 2^x;
    if(x > 1)
        return answer + NumberToBits(x-1);
    }
12
задан Sebastian Zartner 12 June 2015 в 06:20
поделиться

2 ответа

Я использовал бы bookmarklets. Мне связали один XPath, но я не знаю, работает ли он в IE. Я должен пойти, но я протестирую его и дам его, если это будет работать над IE.

Два bookmarklet сайта для Веб-разработчиков от моих закладок: bookmarklets Subsimple и Bookmarklets Squarefree. Партия полезных вещей там...

[РЕДАКТИРОВАНИЕ] хорошо, я вернулся. bookmarklet, который я имел, был для FF только и не был оптимален. Я наконец переписал его, хотя с помощью идей от исходной. Не может найти назад, где я нашел его.

Расширенный JS:

function getNode(node)
{
  var nodeExpr = node.tagName;
  if (nodeExpr == null)  // Eg. node = #text
    return null;
  if (node.id != '')
  {
    nodeExpr += "[@id='" + node.id + "']";
    // We don't really need to go back up to //HTML, since IDs are supposed
    // to be unique, so they are a good starting point.
    return "/" + nodeExpr;
  }
// We don't really need this
//~   if (node.className != '')
//~   {
//~     nodeExpr += "[@class='" + node.className + "']";
//~   }
  // Find rank of node among its type in the parent
  var rank = 1;
  var ps = node.previousSibling;
  while (ps != null)
  {
    if (ps.tagName == node.tagName)
    {
      rank++;
    }
    ps = ps.previousSibling;
  }
  if (rank > 1)
  {
    nodeExpr += '[' + rank + ']';
  }
  else
  {
    // First node of its kind at this level. Are there any others?
    var ns = node.nextSibling;
    while (ns != null)
    {
      if (ns.tagName == node.tagName)
      {
        // Yes, mark it as being the first one
        nodeExpr += '[1]';
        break;
      }
      ns = ns.nextSibling;
    }
  }
  return nodeExpr;
}

var currentNode;
// Standard (?)
if (window.getSelection != undefined) 
  currentNode = window.getSelection().anchorNode;
// IE (if no selection, that's BODY)
else 
  currentNode = document.selection.createRange().parentElement();
if (currentNode == null)
{
  alert("No selection");
  return;
}
var path = [];
// Walk up the Dom
while (currentNode != undefined)
{
  var pe = getNode(currentNode);
  if (pe != null)
  {
    path.push(pe);
    if (pe.indexOf('@id') != -1)
      break;  // Found an ID, no need to go upper, absolute path is OK
  }
  currentNode = currentNode.parentNode;
}
var xpath = "/" + path.reverse().join('/');
alert(xpath);
// Copy to clipboard
// IE
if (window.clipboardData) clipboardData.setData("Text", xpath);
// FF's code to handle clipboard is much more complex 
// and might need to change prefs to allow changing the clipboard content.
// I omit it here as it isn't part of the original request.

Необходимо выбрать элемент и активировать bookmarklet для получения его XPath.

Теперь, bookmarklet версии (благодаря Разработчику Bookmarklet):

IE
(Я должен был повредить его в двух частях, потому что IE не нравится очень длинный bookmarklets (макс. размер варьируется в зависимости от версий IE!). Необходимо активировать первый (функциональное определение) затем второе. Протестированный с IE6.)

javascript:function getNode(node){var nodeExpr=node.tagName;if(!nodeExpr)return null;if(node.id!=''){nodeExpr+="[@id='"+node.id+"']";return "/"+nodeExpr;}var rank=1;var ps=node.previousSibling;while(ps){if(ps.tagName==node.tagName){rank++;}ps=ps.previousSibling;}if(rank>1){nodeExpr+='['+rank+']';}else{var ns=node.nextSibling;while(ns){if(ns.tagName==node.tagName){nodeExpr+='[1]';break;}ns=ns.nextSibling;}}return nodeExpr;}
javascript:function o__o(){var currentNode=document.selection.createRange().parentElement();var path=[];while(currentNode){var pe=getNode(currentNode);if(pe){path.push(pe);if(pe.indexOf('@id')!=-1)break;}currentNode=currentNode.parentNode;}var xpath="/"+path.reverse().join('/');clipboardData.setData("Text", xpath);}o__o();

FF

javascript:function o__o(){function getNode(node){var nodeExpr=node.tagName;if(nodeExpr==null)return null;if(node.id!=''){nodeExpr+="[@id='"+node.id+"']";return "/"+nodeExpr;}var rank=1;var ps=node.previousSibling;while(ps!=null){if(ps.tagName==node.tagName){rank++;}ps=ps.previousSibling;}if(rank>1){nodeExpr+='['+rank+']';}else{var ns=node.nextSibling;while(ns!=null){if(ns.tagName==node.tagName){nodeExpr+='[1]';break;}ns=ns.nextSibling;}}return nodeExpr;}var currentNode=window.getSelection().anchorNode;if(currentNode==null){alert("No selection");return;}var path=[];while(currentNode!=undefined){var pe=getNode(currentNode);if(pe!=null){path.push(pe);if(pe.indexOf('@id')!=-1)break;}currentNode=currentNode.parentNode;}var xpath="/"+path.reverse().join('/');alert(xpath);}o__o();
7
ответ дан 2 December 2019 в 21:46
поделиться

С тех пор bookmarklet использование озадачил Paul, я, хотя я должен добавить немного введения в их использование. Я делаю это в отдельном сообщении, чтобы не смешивать материал.

Bookmarklets (также названный favlets) являются небольшими сценариями JavaScript (так) разработанными, чтобы быть вставленными в строке поиска браузера (как любой другой URL) и таким образом работать на текущей странице.
После выполнения его (вставка, хит Входит), можно отметить его для повторного использования (добавьте его в избранное в IE). Обратите внимание, что браузер мог бы отметить исходный URL вместо этого, необходимо затем отредактировать закладку и заменить URL сценарием.
Конечно, можно добавить его к панели URL для быстрого доступа также.

Эти сценарии действуют как то, чтобы быть частью текущей страницы, получая доступ к глобальным переменным JS и функциям, Объектам DOM, и т.д.
Они могут быть супер простыми, как оригинальное javascript: alert("Hello world!"); или довольно сложный как тот выше. Если это возвращает значение (или если последнее выражение имеет значение), значение заменяет текущую страницу. Для предотвращения этого можно закончить сценарий с alert (чтобы отобразить результат) или перенести сценарий в функциональное определение и вызывают эту функцию, как я сделал выше. (Некоторые также помещают пусто (0); в конце, но я видел, что он рассматривается как плохая практика.)

Функциональное решение имеет преимущество создания всех переменных сценария, локального для апплета (если объявлено с var, конечно), избегая интерференции/побочных эффектов со сценариями на локальной странице. Это также, почему переносящаяся функция должна иметь имя вряд ли для столкновения с локальным сценарием.

Обратите внимание, что некоторые браузеры (читайте: "IE"), может ограничить размер favlets, максимум длина, меняющаяся в зависимости от версии (имеющий тенденцию уменьшаться). Вот почему весь бесполезный пробел удален (bookmarlet разработчик, связанный выше, хорош для этого), и я удалил explict сравнения с пустым и неопределенным, которое я обычно делаю. Я должен был также разделить favlet в два, первая часть, определяющая функцию (проживание целого, страница не изменена/обновлена), вторая часть с помощью него.

Полезный инструмент, особенно на браузерах, не позволяющих пользовательские сценарии (а-ля Механик) или без этого расширения.

3
ответ дан 2 December 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: