2013-05-03 80 views
1

我在我的應用中使用客戶端的JavaScript,我需要基於id,class和tagname來獲取元素,我使用以下代碼獲取使用id的元素。getElementById不在歌劇中工作12.15

 HTML: 
      <!Doctype> 
      <html> 
      <head> 
      <script> 
      (function (tag,fp,n) { 
      var d = document; 
      a = d.createElement(tag), m = d.getElementsByTagName(tag)[0]; 
      a.async = 1; 
      a.src = fp; 
      m.parentNode.insertBefore(a, m) 
      })('script', 'cs.js', 'cs'); 
      </script> 

     </head> 
     <body> 

      <div id="id">click me</div> 
      </body> 
      </html> 


    javascript(cs.js): 

;(function(w, d) { 
     var util = { 
     getElements : function(selector) { 

     var result = []; 
     var hashIndex = selector.indexOf("#"); 
     var dotIndex = selector.indexOf("."); 

     if(hashIndex > -1){ 
      selector = selector.substring(hashIndex+1); 
      var domElem = d.getElementById(selector); 
      console.log(domElem); 
      if(domElem !=null){ 
       result.push(domElem); 
      } 
     } 
     else if(dotIndex > -1){ 
      selector = selector.substring(dotIndex+1); 
      var domElem = d.getElementsByClassName(selector); 
      if(domElem !=null){ 
       result = domElem; 
      } 

     }else{ 
      var domElem = d.getElementsByTagName(selector); 
      if(domElem !=null){ 
       result = domElem; 
      } 
     } 

     return result; 
    } 
    }; 

    console.log(util.getElements("#id")); 


})(window, document); 

它正常工作在瀏覽器,Firefox但在歌劇它給null

Browser Info:歌劇院/ 9.80(X11,Linux的x86_64的)的Presto/2.12.388版本/ 12.15

任何辦法解決這個問題?

+2

你能分享一個現場問題的例子嗎?與此同時,[本bin](http://jsbin.com/ufomam/1/edit)在Opera 12.15 for W7上完美運行。 – 2013-05-03 06:04:29

+1

嘗試構建一個*完整的*減少的測試用例。我們不能說出那個狙擊手有什麼問題。 (如果id的值是'id',則表明即使是這個snippit也是可以設想的,並且可能不會反映那些不工作的代碼)。 – Quentin 2013-05-03 06:04:42

+1

FabrícioMatté的代碼在Opera 12.15上也可以正常工作。 – Quentin 2013-05-03 06:07:12

回答

3

<script>元素。

使用async不保證在腳本運行之前DOM Ready事件將觸發。

移動腳本,使其稍後出現在文檔中,或將其綁定到事件處理程序。

+0

感謝工作正常 – karthick 2013-05-03 09:15:27

0

也許你可以嘗試通過「名」 -attribute給一個DOMElement一個名字,做:

var domElement = document.getElementsByName("element_name")[0]; 
console.log(domElement); 

我希望它工作的方式。

+3

請不要回答這樣模糊的問題。 'getElementsByName'不可取代'getElementById' – Bergi 2013-05-03 07:03:17

0

我沒有該版本的Opera來測試您的聲明,但您可以考慮使用document.querySelector作爲替代方案。

HTML

<div id="id"></div> 

的Javascript

var domElement = document.querySelector("#id"); 
console.log(domElement); 

jsfiddle

更新@bergi

下面是一個例子,其中的環境已被打破,這可能是故意的設計(誰知道),反正OP沒有控制在所述環境中。

document.getElementById = function() { 
    return null; 
}; 

var domElement = document.getElementById("id"); 
console.log(domElement); 

domElement = document.querySelector("#id"); 
console.log(domElement); 

jsfiddle

哦,親愛的,getElementById不起作用,但querySelector一樣。

我不是不同意,這個問題比較模糊,但仍...您要選擇<div>元素之前出現

+0

請不要回答這樣模糊的問題。 'querySelector'並不比'getElementById'更好(有一個具體的例子,但你必須提到這一點) – Bergi 2013-05-03 07:02:49

+0

我沒有說「prefereable」,而是「考慮作爲替代」,這將是一個特例如果getElementById不起作用。但請告訴我你的想法? – Xotic750 2013-05-03 07:04:48

+0

否。如果'document.getElementById'不工作(返回'null'),則'querySelector'也不起作用。 – Bergi 2013-05-03 07:05:50