我正在構建一個Chrome擴展程序,該程序可在任何HTML頁面(即在瀏覽器窗口中查看任何頁面)內創建iFrame。通過Chrome擴展內容腳本在iFrame中激活Zurb基金會的Joyride
iFrame通過Chrome擴展程序的內容腳本「注入」HTML頁面。生成的HTML看起來像這樣:
<html>
<head>..</head>
<body>..</body>
<iframe id="myIframe">...</iframe>
</html>
後的內容腳本添加到主頁面的DOM它繼續通過操縱自己的DOM來填充內容的iframe內嵌框架。我使用Zurb CSS來設置iframe內容的樣式。
而這一切工作正常。
我現在正試圖將Zurb Joyride添加到iframe的內容中,這是我無法工作的原因。
我的清單的content_scripts聲明如下所示:
"content_scripts": [{
"matches": ["*://*/*"],
"js": ["js/externalJS/jquery-2.1.4.min.js",
"js/externalJS/foundation.min.js",
"js/content_script.js"],
"run_at": "document_end"
}],
我懷疑本身需要有機會獲得Zurb腳本的iframe,所以還有foundation.min.js由清單被加載的一部分擴展名,我的內容腳本還在iframe中添加了相關標籤(通過操作DOM)。我的理解是,iframe中的關鍵要素是:
- 標籤Zurb JS文件
- 將對象兜風重視(ID =「testjoyride」)
- 的兜風內容本身
- 初始化調用基金會()
因此,考慮到這一點,我有清單的web_accessible_resources聲明看起來像這樣:
"web_accessible_resources": [
"js/externalJS/jquery-2.1.4.min.js",
"js/externalJS/vendor/modernizr.js",
"js/externalJS/vendor/fastclick.js",
"js/externalJS/foundation.min.js",
"css/foundation.css",
"css/app.css"
],
然後使用內容腳本建立起來的iframe中下面的HTML:
<iframe id="myIframe">
<html>
<head>
<!-- the foundation style sheet (which works fine already) -->
<link type="text/css" rel="stylesheet" href="chrome-extension://extension_id/css/foundation.css">
<!-- the first two scripts -->
<script src="chrome-extension://extension_id/js/externalJS/vendor/modernizr.js"></script>
<script src="chrome-extension://extension_id/js/externalJS/jquery-2.1.4.min.js"></script>
</head>
<body>
<!-- a test object to attach the joyride too -->
<input type="submit" id="testjoyride">
<!-- now the rest of the iframe content -->
... content ...
<!-- the other two scripts -->
<script src="chrome-extension://extension_id/js/externalJS/vendor/fastclick.js"></script>
<script src="chrome-extension://extension_id/js/externalJS/foundation.min.js"></script>
<!-- default joyride code from foundation.zurb.com -->
<ol class="joyride-list" data-joyride="">
<li data-id="testjoyride" data-class="custom so-awesome" data-text="Next" data-prev-text="Prev">
<h4>Stop #1</h4>
</li>
<li data-button="end" data-prev-text="Prev">
<h4>Stop #3</h4>
</li>
</ol>
</body>
</html>
</iframe>
然後,最後,當所有上述內容連接到IFRAME(和IFRAME,當然,附加到父頁面的DOM)我從content_script調用foundation()。我想我需要這樣稱呼它: $(window.frames.myIframe.contentWindow.document).foundation('joyride','start');
即通過在iframe的文檔對象,不是父頁面**
所以我做了這一切,並沒有任何反應。兜風不會出現,HTML也不會轉換爲自動生成的輸出(如here所述)。
我在一個簡單的HTML頁面中創建了一個測試用例,它工作正常,我試圖將該測試頁移動到iframe中,並且蹣跚學步停止工作。因此,我懷疑,儘管沒有多少信心,問題在於iframe,而不是Chrome擴展。
**注意,我把這個調用放在所有DOM操作的末尾。將我創建的新HTML添加到iframe的DOM之後,並在創建完所有聽衆之後,等等。因此,我相信腳本和joyrides應該是「那裏」。但是,如果我在調用基礎('joyride','start')之前粘貼alert(),則警報會顯示一個空的iframe,並且只有在我關閉警報後纔會填充iframe。不管這很重要,還是隻是一個奇怪的警報效果,我都不知道。
暗示您在您的內容腳本中創建iframe嘗試使用'window.postMessage'向您的iframe腳本發送一個事件([示例](https://viget.com/extend/using-javascript-postmessage-to-talk )在此之前,在iframe中插入一個額外的簡單腳本,並在該消息的偵聽器中調用'foundation('joyride','start');'。或者使用chrome API來交換消息,但這可能會更麻煩一些。 – wOxxOm
就是這樣! 3我不明白的事情:1)正如你所說,@ wOxxOm,從iframe調用'foundation('joyride','start')'是答案。但是爲什麼從內容腳本(通過iframe文檔)調用它不起作用? 2)如果我只是使用'innerHTML + ='