2008-08-06 20 views
18

मैं XMLHttpRequest के साथ एक वेब पेज (टैग सूप एचटीएमएल) डाउनलोड कर रहा हूं और मैं आउटपुट लेना चाहता हूं और उसे एक DOM ऑब्जेक्ट में बदलना चाहता हूं जिसे मैं XPATH क्वेरी चला सकता हूं। मैं स्ट्रिंग से DOM ऑब्जेक्ट में कैसे परिवर्तित करूं?मैं फ़ायरफ़ॉक्स एक्सटेंशन में किसी DOM ऑब्जेक्ट में HTML की स्ट्रिंग कैसे बदल सकता हूं?

ऐसा प्रतीत होता है कि सामान्य समाधान एक छिपी हुई आईफ्रेम बनाने और स्ट्रिंग की सामग्री को उसमें फेंकना है। टेक्स्ट/एचटीएमएल का समर्थन करने के लिए DOMParser अपडेट करने के लिए talk पर गया है लेकिन फ़ायरफ़ॉक्स 3.0.1 के रूप में आप अभी भी NS_ERROR_NOT_IMPLEMENTED प्राप्त करते हैं, तो आप कोशिश करते हैं।

क्या छिपी हुई आईफ्रेम चाल का उपयोग करने के अलावा कोई विकल्प है? और यदि नहीं, तो iframe चाल करने का सबसे अच्छा तरीका क्या है ताकि आपका कोड किसी भी वर्तमान में खुले टैब के संदर्भ के बाहर काम करता है (ताकि बंद टैब कोड को पेंच नहीं कर सकें)?

This, मैं क्यों आइफ्रेम हैक के अलावा किसी अन्य समाधान के लिए देख रहा हूँ का एक उदाहरण है कि अगर मैं सभी कि कोड लिखने के लिए एक मजबूत समाधान के लिए है, तो मैं नहीं बल्कि कुछ और की तलाश में रखना चाहते हैं।

उत्तर

7

अजाक्सियन वास्तव में आज post on inserting/retrieving html from an iframe था। आप शायद वहां पोस्ट किए गए जेएस स्निपेट का उपयोग कर सकते हैं।

ब्राउज़र/टैब को बंद करने के लिए, आप onbeforeunload (http://msdn.microsoft.com/en-us/library/ms536907(VS.85).aspx) ईवेंट से अटैचमेंट कर सकते हैं और जो कुछ भी आपको करने की ज़रूरत है उसे करें।

4

इस प्रयास करें:

var request = new XMLHttpRequest(); 

request.overrideMimeType('text/xml'); 
request.onreadystatechange = process; 
request.open ('GET', url); 
request.send(null); 

function process() { 
    if (request.readyState == 4 && request.status == 200) { 
     var xml = request.responseXML; 
    } 
} 

सूचना overrideMimeType और responseXML
तैयारस्टेट == 4 'पूरा' है।

+0

यह तब काम नहीं करता है जब प्रतिक्रिया वैध एक्सएमएल के साथ शुरू नहीं होती है। यदि आप फ़ायरफ़ॉक्स को एक्सएमएल की अपेक्षा करने के लिए कहते हैं तो यह सख्त होगा कि यह किस प्रकार पार्स करेगा। – thelsdj

1

एक div

document.createElement('div'); 

बनाने का प्रयास करें और फिर div के innerHTML को टैग सूप एचटीएमएल निर्धारित किया है। ब्राउज़र को उस XML में संसाधित करना चाहिए, जिसे आप पार्स कर सकते हैं।

innerHTML संपत्ति एक स्ट्रिंग कि पाठ और तत्व का एक मान्य संयोजन निर्दिष्ट करता है लेता है। जब आंतरिक HTML प्रॉपर्टी सेट की जाती है, तो दिया गया स्ट्रिंग ऑब्जेक्ट की मौजूदा सामग्री को पूरी तरह से बदल देता है। यदि स्ट्रिंग में HTML टैग हैं, तो स्ट्रिंग पार्स और स्वरूपित है क्योंकि इसे दस्तावेज़ में रखा गया है।

+0

इस के साथ समस्या यह है कि मुझे पूरे HTML दस्तावेज़, और यह सब जो फेंक देगा, की आवश्यकता है। इसके अलावा मैं मौजूदा विंडोज़/टैब का उपयोग नहीं करने की कोशिश कर रहा हूं क्योंकि मेरा कोड उनके संदर्भ के बाहर चलाता है और मैं किसी उपयोगकर्ता को यादृच्छिक रूप से विंडो या टैब को बंद करने के लिए प्रतिरोधी बनना चाहता हूं जिससे मेरा कोड बाधित हो जाता है (माना जाता है कि फ़ायरफ़ॉक्स अभी भी चल रहा है) । – thelsdj

1

तो आप जावास्क्रिप्ट का उपयोग कर एक XML ऑब्जेक्ट के रूप में एक वेबपृष्ठ डाउनलोड करना चाहते हैं, लेकिन आप वेबपृष्ठ का उपयोग नहीं करना चाहते हैं? चूंकि उपयोगकर्ता पर क्या नियंत्रण नहीं होगा (टैब या विंडो या व्हाट्नॉट बंद करना) आपको ओएसएक्स डैशबोर्ड विजेट या कुछ अलग एप्लिकेशन की तरह ऐसा करने की आवश्यकता होगी। एक फ़ायरफ़ॉक्स एक्सटेंशन भी काम करेगा, जब तक आपको ब्राउजर को बंद करने वाले उपयोगकर्ता के बारे में चिंता न करें।

+0

हां, मैं फ़ायरफ़ॉक्स एक्सटेंशन का उपयोग कर रहा हूं, लेकिन अधिकांश आईफ्रेम उदाहरण ब्राउज़र प्रक्रिया/टैब बंद करने के लिए मूल प्रक्रिया में किसी ऑब्जेक्ट की बजाय मनमाने ढंग से ब्राउज़र विंडो का उपयोग करते हैं। – thelsdj

1

क्या छिपी हुई आईफ्रेम चाल का उपयोग करने के अलावा कोई विकल्प है?

दुर्भाग्य से, नहीं, अब नहीं। अन्यथा आपके द्वारा इंगित माइक्रोस्कोरी कोड इसके बजाय इसका उपयोग करेगा।

और यदि नहीं, तो iframe चाल करने का सबसे अच्छा तरीका क्या है ताकि आपका कोड वर्तमान में खुले टैब के संदर्भ के बाहर काम करता है (ताकि बंद टैब कोड को पेंच नहीं कर सकें)?

आपके द्वारा उद्धृत कोड हाल ही की ब्राउज़र विंडो का उपयोग करता है, इसलिए समापन टैब पार्सिंग को प्रभावित नहीं करेंगे। बंद करना कि ब्राउज़र विंडो आपके भार को निरस्त कर देगी, लेकिन आप इससे निपट सकते हैं (पता लगाएं कि भार निरस्त हो गया है और उदाहरण के लिए इसे दूसरी विंडो में पुनरारंभ करें) और यह अक्सर नहीं होता है।

आपको आईफ़्रेम के ठीक से काम करने के लिए एक डोम विंडो की आवश्यकता है, इसलिए इस समय कोई साफ समाधान नहीं है (यदि आप मोज़िला पार्सर का उपयोग करने के इच्छुक हैं)।

संबंधित मुद्दे