এক্সএমএলএইচটিপিআরকুয়েস্টে কি রেডিস্টেট == 4 এর সমান অনলোড?


122

আমি এক্সএইচআর রিটার্ন ইভেন্টটি সম্পর্কে বিভ্রান্ত হয়েছি, যেমনটি আমি বলতে পারি যে, ওপরেস্টেটেচেন্জ -> রেডিস্টেট == 4 এবং অ্যানলোডের মধ্যে এতটা আলাদা নয় , এটি কি সত্য?

var xhr = new XMLHttpRequest();
xhr.open("Get", url, false);
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4)
    {
        /* do some thing*/
    }
};

xhr.send(null);

অথবা

xhr.onload = function() { /* do something */ }

13
যদি কেউ এটিকে উদাহরণ হিসাবে দেখছেন তবে মনে রাখবেন যে এটি async = মিথ্যা (xhr.open এর তৃতীয় যুক্তি) ব্যবহার করছে - যা সাধারণত আপনি চান তা নয়।
এডিভিউল্ড

উত্তর:


65

এটি একই জিনিস হওয়া উচিত। onloadXMLHttpRequest 2 এ যুক্ত হয়েছিল যদিও onreadystatechangeমূল অনুমানের পরে থেকেই রয়েছে।


দেখে মনে হচ্ছে, অনলোডটি ব্যবহারের সময় সেই মোবাইল সাফারি ফিরে আসে না। অনড্রেসেটেচেন্চ যদিও কাজ করে।
কাই হার্টম্যান

1
এক্সএইচআর 1 এবং এক্সএইচআর 2 এর মধ্যে আর কোনও প্রকৃত স্পষ্ট বিভাজন নেই, তারা একটি মানের সাথে মিশে গেছে। এক্সএইচআর 2 প্রতিনিধিত্বকারী সর্বাধিক সাধারণ বৈশিষ্ট্যটি হ'ল কর্স সমর্থন তাই সেই অবস্থান থেকে এক্সএইচআর 2 আইই 10 পর্যন্ত উপস্থিত হয়নি তবে এক্সএইচআর.অনল্ড আইই 9 তে সমর্থিত ছিল যা সাধারণত এক্সএইচআর 1 হিসাবে বিশ্বাস করা হয়
চেইস

153

এটি প্রায় সর্বদা সত্য। তবে একটি উল্লেখযোগ্য পার্থক্য হ'ল onreadystatechangeইভেন্ট হ্যান্ডলারটি readyState==4সেই ক্ষেত্রে onerrorহ্যান্ডলারটি সাধারণত চালিত হয় (সাধারণত একটি নেটওয়ার্ক সংযোগ সমস্যা)। এটি এক্ষেত্রে 0 এর একটি স্ট্যাটাস পায়। আমি যাচাই করেছি সর্বশেষতম ক্রোম, ফায়ারফক্স এবং আইই তে হয়।

সুতরাং আপনি যদি onerrorআধুনিক ব্রাউজারগুলি ব্যবহার করছেন এবং লক্ষ্যবস্তু করছেন তবে আপনার ব্যবহার করা উচিত নয় onreadystatechangeতবে onloadপরিবর্তে ব্যবহার করা উচিত , যা এইচটিটিপি অনুরোধ সফলভাবে সম্পন্ন হলে (সত্যিকারের প্রতিক্রিয়া এবং স্থিতি কোড সহ) কেবলমাত্র কল করার গ্যারান্টিযুক্ত বলে মনে হয়। অন্যথায় আপনি ত্রুটিগুলির ক্ষেত্রে দুটি ইভেন্ট হ্যান্ডলারগুলি ট্রিগার করা শেষ করতে পারেন (যা আমি এই বিশেষ ক্ষেত্রে সম্পর্কে উত্সর্গীয়ভাবে জানতে পেরেছি))

এখানে আমি লিখেছিলাম একটি প্লঙ্কার পরীক্ষা প্রোগ্রামের একটি লিঙ্ক এখানে আপনাকে বিভিন্ন ইউআরএল পরীক্ষা করতে এবং ইভেন্টগুলির আসল ক্রম দেখতে দেয় এবংreadyState এবং বিভিন্ন ক্ষেত্রে জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন দ্বারা দেখা মানগুলির । জেএস কোডটিও নীচে তালিকাবদ্ধ রয়েছে:

var xhr;
function test(url) {
    xhr = new XMLHttpRequest();
    xhr.addEventListener("readystatechange", function() { log(xhr, "readystatechange") });
    xhr.addEventListener("loadstart", function(ev) { log(xhr, "loadstart", ev.loaded + " of " + ev.total) });
    xhr.addEventListener("progress", function(ev) { log(xhr, "progress", ev.loaded + " of " + ev.total) });
    xhr.addEventListener("abort", function() { log(xhr, "abort") });
    xhr.addEventListener("error", function() { log(xhr, "error") });
    xhr.addEventListener("load", function() { log(xhr, "load") });
    xhr.addEventListener("timeout", function(ev) { log(xhr, "timeout", ev.loaded + " of " + ev.total) });
    xhr.addEventListener("loadend", function(ev) { log(xhr, "loadend", ev.loaded + " of " + ev.total) });
    xhr.open("GET", url);
    xhr.send();
}

function clearLog() {
    document.getElementById('log').innerHTML = '';
}

function logText(msg) {
    document.getElementById('log').innerHTML += msg + "<br/>";
}

function log(xhr, evType, info) {
    var evInfo = evType;
    if (info)
        evInfo += " - " + info ;
    evInfo += " - readyState: " + xhr.readyState + ", status: " + xhr.status;
    logText(evInfo);
}

function selected(radio) {
    document.getElementById('url').value = radio.value;
}

function testUrl() {
    clearLog();
    var url = document.getElementById('url').value;
    if (!url)
        logText("Please select or type a URL");
    else {
        logText("++ Testing URL: " + url);
        test(url);
    }
}

function abort() {
    xhr.abort();
}

2
@ ফার্নান্দো পরিষ্কার করার জন্য, ভিতরে onload, readyState === 4সত্যটি সঠিক হওয়ার নিশ্চয়তা দেওয়া হচ্ছে?
kgf3JfUtW

6
@ স্যাম হ্যাঁ, এটি সর্বদা ক্ষেত্রে বলে মনে হয়, যদিও বিপরীতটি স্পষ্টভাবে সত্য নয়, যেমন readyState4 টি errorবা abortক্ষেত্রেও হতে পারে। এই রাজ্যের মূলত বোঝা যাচ্ছে লোড প্রক্রিয়াটি সফলভাবে শেষ হয়েছে কিনা finished একটি সাধারণ, সফল লোডের জন্য, ইভেন্টগুলির চূড়ান্ত ক্রমটি হ'ল: progress(সমস্ত ডেটা লোড সহ), readystatechange(সহ readyState == 4) load,, loadend
ফার্নান্দো ইখেরেরিয়া

2
মনে রাখবেন যেটি onloadট্রিগার করবে না যদিNo 'Access-Control-Allow-Origin' header is present on the requested resource.
deathangel908

সেটা সত্য. onerrorহ্যান্ডলারটিকে ট্রিগার করার ক্ষেত্রে এটি অন্যতম একটি ঘটনা ।
ফার্নান্দো ইশেভারিয়া

1
@ পেসারিয়র: হ্যাঁ, দয়া করে এখানে দেখুন: plnkr পরীক্ষা
ফার্নান্দো

10

না, তারা এক নয়। আপনি যদি কোনও নেটওয়ার্ক ত্রুটির মুখোমুখি হন বা অপারেশনটি বাতিল করেন onloadতবে ডাকা হবে না। আসলে, সবচেয়ে কাছের ইভেন্টটি readyState === 4হবে loadend। প্রবাহটি দেখতে এমন দেখাচ্ছে:

     onreadystatechange
      readyState === 4
             
 onload / onerror / onabort
             
         onloadend
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.