2012-03-12 149 views
0

我試圖從querySelectorAll以外的網頁中刪除元素,但這似乎不適用於Opera Mobile 11.5。在我將它們放在手機上之前,我已經在PC上試過了這些腳本。querySelectorAll()在Opera Mobile 11.5中不起作用?

Mozilla的文檔很混亂,因爲有兩個關於此功能的頁面,一個是says it's compatible,另一個是says it isn't

有沒有解決方案來解決這個問題?我需要將其他庫用於我製作的這些腳本嗎?

以下是我想做到這一點:

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"); 

回答

1

幾個問題之前添加var

  1. Juan Mendes' answer是正確的刪除命令。如果不反向刪除,JS不但效率低下,而且由於數組值不再有效,腳本崩潰的真正機會。如果效率低下的方式似乎只運行一次或兩次,那只是運氣。

  2. 此外,需要考慮嵌套節點,請注意下面代碼中的額外檢查。

  3. 代碼在Opera, User JavaScript之外似乎對您有用的事實表明您正在使用的節點已通過javascript/AJAX頁面添加。用計時器或類似方法補償。

  4. 如果仍然遇到困難,鏈接到目標頁面後您正試圖確切的CSS選擇器。

  5. 請注意,querySelectorAll() is compatible with 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); 
+0

這真的是一個很好的答案,但是這個函數doesn也不行。我嘗試用一​​個匿名函數來包裝它,然後用window.opera.addEventListener再次用指定的AfterScript事件包裝它,但仍然不銷燬元素。其中一個網站是http://endlessvideo.com/,CSS選擇器是'div [style =「float:left;」] div [style =「margin-left:5px;」] div [style =「float:右鍵;「],div#addthis_button,div#uvTab,a [href * =」vdownloader.com「],[href * =」youtubedownloader.com「]',可在桌面上完美工作Firefox – user1263513 2012-03-13 07:17:38

+0

您最後的代碼評論是「搞砸了」。請編輯該問題以添加任何重要的代碼。不要在這裏使用'addEventListener'或'AfterScript',這就是計時器代碼的用途。事實上,這個特定的代碼可以在[Greasemonkey模式](http://www.opera.com/docs/userjs/examples/#greasemonkey)中正常運行。 ...最後,我不知道Opera Mobile是否支持多個選擇器。首先嚐試一下簡單的東西,比如'deleteByCSS(「#addthis_button」,20);'。我沒有看到任何iFrames,但是如果這些節點中的一些在一箇中,請注意。 – 2012-03-13 07:35:27

+0

我已經嘗試了在UserJS和Greasemonkey模式下的答案中提供的每個函數組合。我非常懷疑Opera Mobile真的支持querySelectorAll()。作爲一種替代方法,您如何看待這個問題:http://v.gd/ovd9UR正如您在演示中看到的那樣,它確實正在討論這個功能 – user1263513 2012-03-13 07:58:19

0

根據caniuse(http://caniuse.com/#search=queryselector)應該通過Opera Mini的支持。

無論如何,如果你想避免這種問題,甚至只是嘶嘶聲,可以使用Zepto或jQuery進行css dom選擇。所有瀏覽器,桌面或移動設備都不支持querySelectorAll和querySelector。在我看來,Mozilla的DOM API的參考並不是很好或最新的。開發人員確實需要一個真正完整且深入的DOM api文檔。

+0

我猜你想說移動而不是迷你。 我試圖用Sizzle進行試驗,然後才結束了我遇到的問題,但我無法弄清楚如何才能用Sizzle實現相同的結果。 github和zip包中的文檔告訴我沒有任何例子,我可以學習它的方式。 – user1263513 2012-03-12 23:31:51

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]); 
    } 
} 

順便說的休息,不要忘記你的局部變量

+0

不是,這也行不通,我認爲在這種情況下向後循環是沒有意義的,因爲elem數組只填充一次,所以我可以通過任何我想要的方式來完成它。 – user1263513 2012-03-12 23:35:14

+1

@ user1263513:elem是一個NodeList,這意味着它是活的。因此,從DOM中刪除節點也將從列表中刪除它們。如果你想迭代前進和刪除元素,你必須增加你的循環索引 – 2012-03-12 23:44:27

+0

奇怪的是,我在我的PC上使用複雜的CSS3選擇器在Firefox上試了一下,結果收集了10個以上的元素,並且所有這些元素都被刪除了,沒有發生任何錯誤 – user1263513 2012-03-12 23:54:32