2013-05-03 45 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