2012-01-30 74 views
0

我創建這將插入Facebook的all.js在頁面中head但它也不是沒有錯誤的工作或者是書籤,那就是:小書籤不工作

javascript: (function() { 
    var msg = ''; 
    if (typeof window.FB == 'object') { 
     msg = 'Already Facebookified'; 
    } else { 
     var js = document.createElement('script'); 
     js.id = 'facebook-jssdk'; 
     js.async = true; 
     js.src = "http://connect.facebook.net/en_US/all.js"; 
     document.getElementsByTagName('head')[0].appendChild(js); 
     msg = (typeof window.FB == 'object' ? 'Facebookified': 'Unable to Facebookify'); 
    } 

    alert(msg); 

})(); 

誰能有什麼建議可能是錯的用它 ?

+0

腳本異步加載,你需要偵聽要完成腳本執行 – zzzzBov 2012-01-30 20:02:44

+0

@zzzzBov:我不知道明白了,你能詳細說明我應該在代碼中做什麼改變嗎? – Dev555 2012-01-30 20:10:44

+0

我認爲我對[這個問題](http://stackoverflow.com/a/5047016/497418)的回答可能是相關的。 – zzzzBov 2012-01-30 20:31:16

回答

2

有嘗試異步加載腳本時做了一些常見的錯誤。此代碼應工作:

function loadScript(src, callback) { 
    var s, 
     r; 
    s = document.createElement('script'); 
    s.src = src; 
    s.onload = s.onreadystatechange = function() { 
/** 
* LOAD/READYSTATE LOGIC 
* execute if the script hasn't been ready yet and: 
* - the ready state isn't set 
* - the ready state is complete 
* - note: readyState == 'loaded' executes before the script gets called so 
*  we skip this event because it wouldn't have loaded the init event yet. 
*/ 
    if (!r && (!this.readyState || this.readyState === 'complete')) { 
     //set the ready flag to true to keep the event from initializing again 
     r = true; 
     callback(); 
    } 
    }; 
    document.body.appendChild(s); 
} 

你可以使用它作爲:

loadScript('http://connect.facebook.net/en_US/all.js', function() {console.log(window.FB)} 
+0

感謝它現在的作品:) – Dev555 2012-01-31 06:49:55

2

你可能想使用window.fbAsyncInit運行代碼,一旦Facebook的JS-SDK被加載並添加fb-root節點(這是需要某些功能):

javascript: (function() { 
    var msg = ''; 
    if (typeof window.FB == 'object') { 
    alert('Already Facebookified'); 
    } else { 
    window.fbAsyncInit = function(){ 
     alert('JS-SDK loaded'); 
    }; 
    var d = document, 
     js = d.createElement('script'), 
     root_node = d.createElement('div'); 
    js.id = 'facebook-jssdk'; 
    js.async = true; 
    js.src = "//connect.facebook.net/en_US/all.js"; 
    root_node.id = 'fb-root'; 
    d.getElementsByTagName('body')[0].appendChild(root_node); 
    d.getElementsByTagName('head')[0].appendChild(js); 
    } 
})(); 
+0

謝謝,但是它在控制檯上給出了這個錯誤:'Uncaught SyntaxError:意外的令牌var',當我從書籤運行它。 – Dev555 2012-01-30 20:31:06

+0

我修復了剪裁(這是因爲所有行都合併,並且在第8行上的大括號之後需要分號) – 2012-01-30 20:35:49

0

由於zzzzBov指出的那樣,你將需要「聽」腳本來完成加載。爲此,至少有兩個腳本元素事件可以掛鉤(onreadystatechange和onload)。你可以設置它們如下:

javascript: (function() { 
    var isFacebookified = function() { 
     return typeof window.FB === 'object'; 
    }; 
    var scriptIsDoneLoading = function() { 
     var msg = (isFacebookified ? 'Facebookified': 'Unable to Facebookify'); 
     alert(msg); 
    }; 
    if (isFacebookified()) { 
     alert('Already Facebookified'); 
    } else { 
     var js = document.createElement('script'); 
     js.id = 'facebook-jssdk'; 
     js.async = true; 
     js.src = "http://connect.facebook.net/en_US/all.js"; 
     js.onreadystatechange = scriptIsDoneLoading; 
     js.onload = scriptIsDoneLoading; 
     document.getElementsByTagName('head')[0].appendChild(js); 
    } 
})(); 

腳本加載完成後,你應該得到警報。

希望這有助於

皮特

+0

它也沒有幫助。當我把它放入書籤並運行時,沒有任何錯誤,並且我收到了已經用Facebook的信息,但是用了firebug console.log(typeof window.FB)'returns'undefined' – Dev555 2012-01-30 20:40:23

+0

哎呀! 'if(isFacebookified){'should be'if(isObified()){'否則我們檢查函數的存在而不是調用它。添加額外的parens後,它適用於我。編輯回覆以反映正確的代碼。 – pete 2012-01-30 22:05:41