为什么send经常被称为
send
xhr.send(null)
代替
xhr.send()
?
W3,MDN和MSDN都声明它是可选的。此外,ActiveX控件似乎不需要参数:
hr=pIXMLHTTPRequest.CreateInstance("Msxml2.XMLHTTP.6.0"); SUCCEEDED(hr) ? 0 : throw hr; hr=pIXMLHTTPRequest->open("GET", "http://localhost/books.xml ", false); SUCCEEDED(hr) ? 0 : throw hr; hr=pIXMLHTTPRequest->send(); // <-- this line SUCCEEDED(hr) ? 0 : throw hr;
这种做法send(null)至少可以追溯到2005年的Google Maps中,但被缩小了,没有任何解释:
send(null)
Y.asynchronousTransform = function (qc, vb, kc, Nc, Ba) { if (m.type == 3) return; var cc = Y.getCached(kc); if (cc) { cc.transformToHTML(qc, vb); if (Nc) Nc(); return } var yc = qa.create(Ba); var sa = Xd.create(); nd('<a href="' + kc.xmlEscape() + '">' + kc.xmlEscape() + "</a>", 0); sa.open("GET", kc, true); sa.onreadystatechange = function () { if (sa.readyState == 4) { if (yc.isValid()) { try { var Db = sa.responseXML; var cc = Y.create(Db); Y.cache(kc, cc); cc.transformToHTML(qc, vb); if (Nc) Nc() } catch (b) {} } } }; sa.send(null) }
如果您看一下XMLHttpRequest的旧规范,似乎W3C似乎并不需要在某一点上将该参数设为可选,这可能导致人们提供了一个明确的null值,以防万一。
(搜索“应支持发送”) http://web.archive.org/web/20060409155734/http://www.w3.org/TR/XMLHttpRequest/
我遇到的另一个可能的原因来自俄语页面的翻译,可在此处查看:较长的Google Translate链接(搜索“没有ActiveX的GET请求版本”)
当发送不带ActiveX的版本的GET请求时,必须指定null,否则不能指定任何参数。如果始终将GET指定为null,则不会失败:
我不知道这是否成立,但如果主体中包含GET参数,则似乎是合理的,如果数据值“未定义”,则可能未生成主体。
不幸的是,我无法在搜索中找到更具决定性的内容。