2017-08-07 19 views
2

スクリプト内で.popoverメソッドにアクセスできないようです。私が戸惑う場合を除き、私はBootstrap Native(Jquery-free Bootstrap)ファイルからそのメソッドにアクセスする必要があります。 ?Chrome拡張機能のスクリプト/機能が定義されていない(ブートストラップネイティブ?)

すべてのスクリプトはリンクを追加し、理想的にはその要素のポップオーバーです。ここで

は私のコードです:

マニフェスト:

{ 
    "name": "foo", 
    "description": "Work in Progress", 
    "manifest_version": 2, 
    "version": "0.8", 
    "icons": { 
    "16": "icon16.png", 
    "48": "icon48.png", 
    "128": "icon128.png" 
    }, 
    "permissions": [ 
    "activeTab", 
    "http://*/", 
    "https://*/" 
    ], 
    "background": { 
    "scripts": ["background.js"], 
    "persistent": false 
    }, 
    "browser_action": { 
    "default_title": "Click me!" 
    } 
} 

背景:(アイコンのクリックで実行)

chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.executeScript(tab.id, {file: "bootstrap-native.js" }, function() { 
     chrome.tabs.executeScript(tab.id, {file: "content_script.js"}); 
}); 

}); 

content_script.js:

// Handle page's frame (to allow DOM access) 
var page = top.frames["TargetContent"].document; 

// Reference every professor listed and modify the registration page 
Array.from(page.querySelectorAll("[id^='MTG_INSTR$']")).forEach(el => { 
    if (el.textContent == "Staff") { 
     return; 
    } 

    // For every professor found, search for RMP page 
    searchProfessor(el) 

}); 



/** 
* Search for professor on RMP, then pass along to pageCheck 
* 
* @param {Reference to prof} professorEl 
*/ 
function searchProfessor(professorEl) { 
    var xhr = new XMLHttpRequest(); 

    xhr.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      pageCheck(this.response,professorEl); 

     } 
    } 

    // Search RMP using CSUF + Prof Name 
    xhr.open('GET', 'https://www.ratemyprofessors.com/search.jsp?queryoption=HEADER&queryBy=teacherName&schoolName=california+state+university+fullerton&schoolID=&query=' + professorEl.textContent +'&_action_search=Search'); 
    xhr.responseType = 'document'; 
    xhr.send(); 
} 



/** 
* Verify prof's page exists and modify registration page 
* 
* @param {DOM Obj} page 
* @param {Reference to prof} element 
*/ 
function pageCheck(page,element){ 

    var ProfURL = page.getElementsByClassName('listing PROFESSOR')[0].childNodes[1].href 

    // If the element exists, we have a hit (and the prof's page!) 
    if (ProfURL) { 
     // Link to the prof's RMP page 
     addAnchor(element, ProfURL);  

     // Access the prof's specific RMP page 
     var xhr1 = new XMLHttpRequest(); 

     // Create box to display prof info on hover 
     xhr1.onreadystatechange = function() { 
      if (this.readyState == 4 && this.status == 200) { 
       addTooltip(this.response,element); 
      } 
     } 

     xhr1.open('GET', ProfURL); 
     xhr1.responseType = 'document'; 
     xhr1.send(); 

    } 

} 

function addTooltip(profPage,profElement) { 

var name = profElement.textContent; 
var grade = profPage.getElementsByClassName('grade')[0].textContent;  
var difficulty = profPage.getElementsByClassName('grade')[2].textContent; 
var ratings = profPage.getElementsByClassName('table-toggle rating-count active')[0].textContent; 
ratings = ratings.trim(); 
var content = "Grade: " + grade; 

profElement.firstChild.setAttribute("data-toggle","popover"); 
profElement.firstChild.setAttribute("data-trigger","hover"); 
profElement.firstChild.setAttribute("title",name); 
profElement.firstChild.setAttribute("data-content",content); 
profElement.popover(); 

}

ネイティブブートストラップする
/** 
* Assign hyperlink to element 
* 
* @param {Element} wrapper 
* @param {String} URL 
*/ 
function addAnchor (wrapper, URL) { 

    var a = document.createElement('a'); 
    a.href = URL; 
    a.textContent = wrapper.textContent; 

    // Opens in new window/tab 
    a.setAttribute('target', '_blank'); 
    wrapper.replaceChild(a, wrapper.firstChild); 
} 

リンク:

https://github.com/thednp/bootstrap.native

http://thednp.github.io/bootstrap.native/

エラー:

content_script.js:75 Uncaught TypeError: profElement.popover is not a function 
    at addTooltip (content_script.js:75) 
    at XMLHttpRequest.xhr1.onreadystatechange (content_script.js:61) 

ブートストラップnativ eはダウンロードしたbootstrapのnative/dist /フォルダから68kbのファイルです。これは問題ではないかと思います。なぜなら、このファイルに変数を記述すると、コンテンツスクリプト内ではアクセスできますが、メソッドではアクセスできないからです。

私はこのすべてに夢中です。多分、私がブートストラップネイティブ用に持っているファイルは、正しいものではありません。または、私はメソッドを正しく呼び出すのではないが、それは私にこのエラーを与えるべきではありません。

答えて

1

デフォルトでは、executeScriptはonly in the main pageをインラインフレームに挿入します。

あまりにもiframe内にブートストラップ・ネイティブを注入するallFrames: trueを指定します。

chrome.tabs.executeScript(tab.id, {allFrames: true, file: "bootstrap-native.js"}, ...... 
+0

なぜこれが適用されますでしょうか? – Xan

+1

'top.frames [" TargetContent "]のために。document' – wOxxOm

+0

これを試して報告してください!どうもありがとうございます!!!! – Kevin

関連する問題