2012-07-27 14 views
58

Bir krom uzantım var. Mevcut sayfanın HTML kaynağından analiz etmem gerekiyor. Burada arka plan sayfaları ve içerik betikleri ile her türlü çözümü buldum ama hiçbiri bana yardım etmedi.
manifest.json:Geçerli sayfanın kaynak HTML'sini krom uzantısından almak

{ 
    "name": "Extension", 
    "version": "1.0", 
    "description": "Extension", 
    "browser_action": { 
    "default_icon": "bmarkred.ico", 
    "popup": "Test.html" 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["http://*/*"], 
     "js": ["content.js"] 
    } 
    ], 
    "background": { 
    "page": "backgroundPage.html" 
    }, 
    "permissions": [ 
    "cookies", 
    "tabs", 
    "http://*/*", 
    "https://*/*" 
    ] 
} 

background.html:

<html> 
<head> 
<script type="text/javascript"> 
    try { 
     chrome.tabs.getSelected(null, function (tab) { 
      chrome.tabs.sendRequest(tab.id, {action: "getSource"}, function(source) { 
       alert(source); 
      }); 
     }); 
    } 
    catch (ex) { 
     alert(ex); 
    } 
</script> 
</head> 
</html> 

content.js:

chrome.extension.onRequest.addListener(function(request, sender, callback) { 
    if (request.action == "getSource") { 
     callback(document.getElementsByTagName('html')[0].innerHTML); 
    } 
}); 

uyarı daima tanımsız uyarıları burada ben bugüne kadar ne olduğunu. Hala

callback('hello'); 

aynı sonucu: i content.js içinde değiştirseniz bile üzere geri çağırma işlevi dosya. Neyi yanlış yapıyorum? belki de yanlış yöne gidiyorum. Gerçekten ihtiyacım olan bu. Kullanıcı uzantı açılır penceresini açtığında (ve sadece o zaman), mevcut sayfanın HTML’ine ihtiyacım var, böylece onu analiz edebilirim. baska öneri?

+0

bir problem (içerik komut enjekte edilmeden önce) Arka plan sayfasında kod hemen çalışır olmasıdır. Çok benzer/tekrarlanmış bir soru daha önce sorulmuştur; [Yeni bir Google Chrome sekmesini aç ve kaynağı al] 'daki cevaba bir göz atın (http://stackoverflow.com/a/10162291/938089?open-a-new-google-chrome-tab-and-get- kaynak). –

+0

Yanıt yazdığınız için teşekkür ederiz. Ekteki bağlantınızdaki kod bölümlerini kopyaladım ancak hala çalışmıyor. Sorun şu ki, uzantım bir pop-up ve HTML'yi yalnızca kullanıcı uzantıyı açtığında almam gerekiyor. Örneğin, geçerli sekme facebook.com ise, sadece uzantımı açtığımda, html kaynağını js dosyasına (içerik komut dosyasını veya arka plan sayfasını değil) alırım. –

+0

Sorunuzu güncel kodunuzla güncelleyin. Kod, sorunu vurgulayan yorumlar içermelidir. –

cevap

111

manifest.json .... böylece geri pop-up penceresine gelen kaynak ve mesajı almak istiyorum sayfaya bir komut dosyası enjekte

{ 
    "name": "Get pages source", 
    "version": "1.0", 
    "manifest_version": 2, 
    "description": "Get pages source from a popup", 
    "browser_action": { 
    "default_icon": "icon.png", 
    "default_popup": "popup.html" 
    }, 
    "permissions": ["tabs", "<all_urls>"] 
} 

popup.html

<!DOCTYPE html> 
<html style=''> 
<head> 
<script src='popup.js'></script> 
</head> 
<body style="width:400px;"> 
<div id='message'>Injecting Script....</div> 
</body> 
</html> 

popup.js

chrome.runtime.onMessage.addListener(function(request, sender) { 
    if (request.action == "getSource") { 
    message.innerText = request.source; 
    } 
}); 

function onWindowLoad() { 

    var message = document.querySelector('#message'); 

    chrome.tabs.executeScript(null, { 
    file: "getPagesSource.js" 
    }, function() { 
    // If you try and inject into an extensions page or the webstore/NTP you'll get an error 
    if (chrome.runtime.lastError) { 
     message.innerText = 'There was an error injecting script : \n' + chrome.runtime.lastError.message; 
    } 
    }); 

} 

window.onload = onWindowLoad; 

getPagesSource.js

// @author Rob W <http://stackoverflow.com/users/938089/rob-w> 
// Demo: var serialized_html = DOMtoString(document); 

function DOMtoString(document_root) { 
    var html = '', 
     node = document_root.firstChild; 
    while (node) { 
     switch (node.nodeType) { 
     case Node.ELEMENT_NODE: 
      html += node.outerHTML; 
      break; 
     case Node.TEXT_NODE: 
      html += node.nodeValue; 
      break; 
     case Node.CDATA_SECTION_NODE: 
      html += '<![CDATA[' + node.nodeValue + ']]>'; 
      break; 
     case Node.COMMENT_NODE: 
      html += '<!--' + node.nodeValue + '-->'; 
      break; 
     case Node.DOCUMENT_TYPE_NODE: 
      // (X)HTML documents are identified by public identifiers 
      html += "<!DOCTYPE " + node.name + (node.publicId ? ' PUBLIC "' + node.publicId + '"' : '') + (!node.publicId && node.systemId ? ' SYSTEM' : '') + (node.systemId ? ' "' + node.systemId + '"' : '') + '>\n'; 
      break; 
     } 
     node = node.nextSibling; 
    } 
    return html; 
} 

chrome.runtime.sendMessage({ 
    action: "getSource", 
    source: DOMtoString(document) 
}); 
+0

@Gil Tankus İlk yazdığım için özür dilerim, yorumlara yeterince dikkat etmedim (tekrar) ve sadece Rob W'nin söylediklerini tekrarlamakla sona erdi. Yeni yazı istediğin şeye sahip olmalı. – PAEz

+0

Teşekkürler, cevabınız gerçekten yardımcı oldu, sorun şu ki onMessage on asenkronize olur. benim pop-up'ımda, kaynak HTML üzerinde geçiş yapan diğer her tür şey var. Kaynağı global bir varlığa nasıl kaydedebilirim ve sonra sayfa yüklenme işleviyle devam edebilirim? –

+0

Yapabileceğini sanmıyorum. Ya sizin geri arama koduna veya bir fonksiyona koymanız gerekecek ve sadece JS'nin “goto” komutu var mıydı? ; P – PAEz

İlgili konular