2010-03-02 18 views
23

का उपयोग करते समय सभी शारीरिक सामग्री को प्रतिस्थापित करता है मैं एक साधारण AJAX कॉल बना रहा हूं जो निर्दिष्ट यूआरएल की सामग्री को पुनर्प्राप्त करता है और इसे पृष्ठ पर लिखता है। समस्या मैं कर रहा हूँ कि यह इस जानकारीजावास्क्रिप्ट दस्तावेज़। राइट AJAX

यहाँ

साथ पूरे शरीर सामग्री को बदल देता है जे एस है:

(function(){ 
    var mb = window.mb = {}; 

    function get_ad(url, parameters){ 
     var result = ""; 
     var http_request = false; 

     if (window.XMLHttpRequest) { // Mozilla, Safari,... 
      http_request = new XMLHttpRequest(); 
      if (http_request.overrideMimeType) { 
       http_request.overrideMimeType('text/html'); 
      } 
     } else if (window.ActiveXObject) { // IE 
      var avers = ["Microsoft.XmlHttp", "MSXML2.XmlHttp", "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp.4.0", "MSXML2.XmlHttp.5.0"]; 
      for (var i = avers.length -1; i >= 0; i--) { 
       try { 
        http_request = new ActiveXObject(avers[i]); 
        if (http_request){ 
         break; 
        } 
       } catch(e) {} 
      } 
     } 
     if (!http_request) { 
      alert('Cannot create XMLHTTP instance'); 
      return false; 
     } 

     http_request.onreadystatechange = function(){ 
               if (http_request.readyState == 4) { 
               if (http_request.status == 200) { 
                gen_output(http_request.responseText); 
               } else { 
                alert('Error'); 
               } 
               } 
              } 

     http_request.open('GET', url + parameters, true); 
     http_request.send(null); 
    } 

    function gen_output(ad_content){ 
     document.write("<div id=\"mb_ad\">"); 
     document.write(ad_content); 
     document.write("</div>"); 
    } 

    get_ad("http://localhost/test/test.html", ""); 
})(); 

और यहाँ एचटीएमएल है:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
</head> 

<body> 
    i am text before <br/> 
    <script type="text/javascript" src="mb.js"></script> 
    <br /> 
    i am text after 
</body> 
</html> 

फ़ायरबग का उपयोग कर निरीक्षण करने के लिए, मुझे पहले या पाठ के बाद टेक्स्ट नहीं दिखाई देता है, बस <div id="mb_ad"> और test.html पृष्ठ की सामग्री। अगर मैं AJAX कॉल को हटा देता हूं और केवल 3 document.writes टेक्स्ट पहले और पाठ ठीक से प्रदर्शित होने के बाद करता है। jQuery एक विकल्प नहीं है, मुझे इसे बड़ी लाइब्रेरी की मदद के बिना करना है क्योंकि आकार और गति सार के हैं।

+2

मैं क्या अपने कोड के साथ गलत हो सकता है नहीं मिल सकता है, मैं इसे अधिक निरीक्षण की जरूरत है लगता है कि निम्नलिखित कोड के साथ एक ही समस्या थी/ब्रेक पॉइंट। लेकिन "jQuery एक विकल्प नहीं है" के लिए, मैं वास्तव में सहमत नहीं हूं, जावास्क्रिप्ट के 24ko (जो शायद Google सीडीएन का उपयोग कर कैश किया गया है) वास्तव में किसी वेबपृष्ठ पर कोई फर्क नहीं पड़ता है। यदि आपके पास वह मजबूत आवश्यकता है तो मुझे यकीन नहीं है कि कोई वेबसाइट या यहां तक ​​कि नेटवर्क एप्लिकेशन भी एक अच्छा विचार है। – Mathieu

+0

इसके अलावा, आप हल्के लाइब्रेरी जैसे डोमासिस्टेंट या इसी तरह का उपयोग कर सकते हैं। – dusoft

+0

को इस तथ्य के साथ यह करना होगा कि इस स्क्रिप्ट को अन्य वेबसाइटों में डाला जाएगा, इसलिए ऐसी वेबसाइट पर jquery जैसे लाइब्रेरी को जोड़ने के लिए जो शायद अन्य पुस्तकालयों का उपयोग कर रहा हो, या यहां तक ​​कि यहां तक ​​कि jquery भी, केवल समस्याएं पैदा करेगा। –

उत्तर

41

दस्तावेज़ लोड होने के बाद आप document.write का उपयोग नहीं कर सकते हैं। यदि आप करते हैं, तो ब्राउज़र एक नया दस्तावेज़ खुल जाएगा जो वर्तमान को बदल देता है।

एक तत्व के अंदर एचटीएमएल कोड डाल करने के लिए innerHTML संपत्ति का उपयोग करें:

function gen_output(ad_content){ 
    document.getElementById('mb_ad').innerHTML = ad_content; 
} 

, स्क्रिप्ट से पहले तत्व रखो ताकि आप यकीन है कि यह जब कॉलबैक फ़ंक्शन कहा जाता है मौजूद हैं:

i am text before 
<div id="mb_ad"></div> 
i am text after 
<script type="text/javascript" src="mb.js"></script> 

इससे कोई फर्क नहीं पड़ता कि आप स्क्रिप्ट कहां रखते हैं, क्योंकि दस्तावेज़ में कुछ भी नहीं लिखा जाएगा।

+0

क्या यह संभव है कि मैं एक अलग 'div' के बिना कोशिश कर रहा हूं? यह ऐसा कुछ ऐसा माना जाता है जो किसी क्लाइंट साइट में एम्बेड किया गया हो, और मुझे इसे एक स्क्रिप्ट कॉल के साथ करने के लिए कहा गया था। –

+0

हां, आप AJAX कॉल करने से पहले पृष्ठ पर div लिखने के लिए document.write का उपयोग कर सकते हैं। – Guffa

+0

यह बहुत अच्छा काम करता है, धन्यवाद! –

2
var div = document.createElement('div'); 
div.id = 'mb_ad'; 
div.innerHTML = ad_content;

अब, आप जहां भी चाहें इस नोड को जोड़ सकते हैं।

13

मामले में आप दूरस्थ स्क्रिप्ट तुम इतनी तरह कुछ लिखने के लिए सक्षम हो सकता है नहीं कर सकते पर नियंत्रण:

<script> 
var tmp = document.write; 

document.write = function() { 
    document.getElementById('someId').innerHTML = [].concat.apply([], arguments).join(''); 
}; 
</script> 
<script .....> 
document.write = tmp; 

खैर यह एक बुरा हैक है, लेकिन यह काम करने लगता है ...

0

आप उपयोग कर सकते हैं <script>document.body.innerHTML+="//Your HTML Code Here";</script>

0

ही लियोन Fedotov जवाब लेकिन अधिक jQuery

{ 
    var old_write = document.write; 

    var $zone = $('.zone.zone_' + name); 
    // redefine document.write in this closure 
    document.write = function() { 
    $zone.append([].concat.apply([], arguments).join('')); 
    }; 
    // OA_output[name] contains dangerous document.write 
    $zone.html(OA_output[name]); 

    document.write = old_write; 
} 
0

मैं

$html[] = '<script> 
      if($("#mf_dialogs").length == 0) { 
       document.write("<div id=\"mf_dialogs\"></div>"); 
      } 
      </script>'; 

निम्नलिखित कोड दस्तावेज़.लिखें कुशलता से बदल देता है:

$html = '<div id="dialogHolder"></div> 
     <script> 
       if($("#mf_dialogs").length == 0) { 
        document.getElementById("dialogHolder").innerHTML="<div id=\"mf_dialogs\"></div>"; 
       } 
     </script>'; 
संबंधित मुद्दे