2012-12-19 51 views
6
 var style1 = document.createElement("link"); 
     style1.id = "rel"; 
     style1.rel = "stylesheet"; 
     style1.href = "http://www.mysite.com/css.css"; 
     style1.onload = function(){document.body.innerHTML+="fffffff";}; 
     document.getElementsByTagName("head")[0].appendChild(style1); 

此代碼適用於Chrome/Firefox,但我的Froyo(2.3)和Jellybean(4.1)Android設備上的庫存瀏覽器不會打印任何內容。有什麼問題?我想如果我可以執行一些js onload鏈接。在我的情況下,其他任何事情都會造成黑客攻擊。 :/爲什麼鏈接元素的onload屬性對於Android股票瀏覽器不可靠?

問題不在於innerHTML。如果你想(如果你想要的話)嘗試使用警報(在你自己的危險中)。

另一個答案提到檢查此功能通過做

var huh = 'onload' in document.createElement('link'); 

..但是這是在這兩個股票的瀏覽器真!跆拳道傢伙?

+0

如何使用[聽真實事件](HTTPS://developer.mozilla。 org/en-US/docs/DOM/element.addEventListener)而不是DOM0垃圾? –

+0

添加鏈接到dom(無錯誤,樣式表從不加載)後,這不適用於移動設備:document.getElementById(「my_rel」)。addEventListener('load',prepClasses,false); – Amalgovinus

回答

4

Android的瀏覽器不支持 「的onload」/ 「的onreadystatechange」 爲元素的事件:http://pieisgood.org/test/script-link-events/
但它返回:

"onload" in link === true 

所以,我的解決方案是從的userAgent發現Android瀏覽器,然後等待樣式表中的一些特殊的css規則(例如,重置「body」邊距)。
如果不是Android瀏覽器,它支持 「的onload」 事件 - 我們將使用它:

var userAgent = navigator.userAgent, 
    iChromeBrowser = /CriOS|Chrome/.test(userAgent), 
    isAndroidBrowser = /Mozilla\/5.0/.test(userAgent) && /Android/.test(userAgent) && /AppleWebKit/.test(userAgent) && !iChromeBrowser; 

addCssLink('PATH/NAME.css', function(){ 
    console.log('css is loaded'); 
}); 

function addCssLink(href, onload) { 
    var css = document.createElement("link"); 
    css.setAttribute("rel", "stylesheet"); 
    css.setAttribute("type", "text/css"); 
    css.setAttribute("href", href); 
    document.head.appendChild(css); 
    if (onload) { 
     if (isAndroidBrowser || !("onload" in css)) { 
      waitForCss({ 
       success: onload 
      }); 
     } else { 
      css.onload = onload; 
     } 
    } 
} 

// We will check for css reset for "body" element- if success-> than css is loaded 
function waitForCss(params) { 
    var maxWaitTime = 1000, 
     stepTime = 50, 
     alreadyWaitedTime = 0; 

    function nextStep() { 
     var startTime = +new Date(), 
      endTime; 

     setTimeout(function() { 
      endTime = +new Date(); 
      alreadyWaitedTime += (endTime - startTime); 
      if (alreadyWaitedTime >= maxWaitTime) { 
       params.fail && params.fail(); 
      } else { 
       // check for style- if no- revoke timer 
       if (window.getComputedStyle(document.body).marginTop === '0px') { 
        params.success(); 
       } else { 
        nextStep(); 
       } 
      } 
     }, stepTime); 
    } 

    nextStep(); 
} 

演示:http://codepen.io/malyw/pen/AuCtH

相關問題