0

我正在尝试从网页中删除不必要的元素querySelectorAll,但这似乎不适用于Opera Mobile 11.5。在将脚本放到手机上之前,我已经在 PC 上试用了这些脚本。

Mozilla 的文档令人困惑,因为有两页关于此功能的内容,一页说兼容,另一页说不兼容。

有解决这个问题的方法吗?我是否需要在我制作的这些脚本中实现其他库?

这是我想做的事情:

function deleteByCSS(el) {
 elem = document.body.querySelectorAll(el);
 for (i=0; i<elem.length; i++){
  elem[i].parentNode.removeChild(elem[i]);
 }
}
deleteByCSS("here goes every CSS selector pointing to objects I want to remove");
4

3 回答 3

1

问题很可能是您在迭代它们时从列表中删除元素。一个安全的选择是向后循环,这样,删除节点不会影响列表的其余部分

function deleteByCSS(el) {
  var elem = document.body.querySelectorAll(el);
  for (var i=elem.length - 1; i>=0; i--){
    elem[i].parentNode.removeChild(elem[i]);
  }
}

顺便说一句,不要忘记var在你的局部变量之前添加

于 2012-03-12T23:07:45.627 回答
1

几个问题:

  1. 关于删除顺序,胡安·门德斯的回答是正确的。如果不反向删除,不仅JS效率低下,而且由于数组值不再有效而导致脚本崩溃的真正机会。如果这种低效的方法似乎能奏效一两次,那只是运气。

  2. 此外,需要考虑嵌套节点,请注意下面代码中的额外检查。

  3. 该代码似乎在Opera用户 JavaScript之外为您工作,这表明您正在使用的节点是由页面 javascript/AJAX 添加的。使用计时器或类似方法进行补偿。

  4. 如果仍然遇到困难,链接到目标页面发布您正在尝试的确切 CSS 选择器

  5. 请注意,querySelectorAll()它与 Opera Mobile 11.5 兼容,并且这两个页面都这样说或显示一个问号——这并不意味着它不兼容,只是 Mozilla 没有测试它(其他人有)。请注意,和之间可能存在差异,因此是两个页面。document.querySelectorAll(){element}.querySelectorAll()

把它们放在一起,这样的代码应该可以工作:

function deleteByCSS (cssSelector, delayLoopMax, delayMilliSecs) {
    //-- Use defaults, if not specified.
    var delayLoopMax    = delayLoopMax   || 0;
    var delayMilliSecs  = delayMilliSecs || 300;
    //console.log ("Args: ", cssSelector, delayLoopMax, delayMilliSecs);

    var doomedElements  = document.body.querySelectorAll (cssSelector);
    if (doomedElements  &&  doomedElements.length) {
        //console.log ("Found!");
        //-- Found the node(s); delete it/them.
        for (var J = doomedElements.length - 1;  J >= 0;  --J) {
            var doomedNode  = doomedElements[J];
            if (doomedNode) {
                doomedNode.parentNode.removeChild (doomedNode);
            }
        }
    }
    else {
        //-- Nodes not found. Wait for JS to add them, if specified.
        if (delayLoopMax > 0) {
            delayLoopMax--;
            setTimeout (
                deleteByCSS,
                delayMilliSecs,
                cssSelector, delayLoopMax, delayMilliSecs
            );
        }
    }
}


在这种情况下,将其与初始额外参数 20 一起使用...

deleteByCSS ("*VALID* CSS selector", 20);
于 2012-03-13T05:23:32.827 回答
0

根据 caniuse ( http://caniuse.com/#search=queryselector ),opera mini 应该支持它。

无论如何,如果您想避免此类问题,甚至只是嘶嘶作响,请使用 Zepto 或 jQuery 进行 css dom 选择。querySelectorAll 和 querySelector 显然并非所有浏览器(桌面或移动设备)都支持。在我看来,Mozilla 的 DOM api 的参考不是很好,也不是最新的。开发者确实需要一个真正完整而深入的 DOM api 文档。

于 2012-03-12T23:03:41.153 回答