谁制作Ajax电话,网络浏览器或JavaScript解释器?

时间:2016-08-01 05:05:37

标签: javascript ajax

需要了解有关如何使用Ajax提交HTTP请求的更多信息。

3 个答案:

答案 0 :(得分:1)

AJAX的定义

AJAX代表异步JavaScript和XML。简而言之,它是使用XMLHttpRequest对象与服务器端脚本进行通信。它可以发送和接收各种格式的信息,包括JSON,XML,HTML甚至文本文件。然而,AJAX最吸引人的特性是它的“异步”特性,这意味着它可以在不刷新页面的情况下完成所有这些工作。这使您可以根据用户事件更新页面的某些部分。

XMLHttpRequest是Browser for AJAX提供的对象。

答案 1 :(得分:0)

AJAX是一个JavaScript(一组)库,它包含在您的应用程序中并由浏览器的解释器执行。

答案 2 :(得分:0)

JavaScript通常被认为对脚本(*)可见一个执行线程,因此当您输入内联脚本,事件侦听器或超时时,您将完全控制,直到从块结束返回或功能

(*:忽略浏览器是否真的使用一个OS线程实现其JS引擎的问题,或WebWorkers是否引入了其他有限的执行线程。)

然而,实际上这并非如此,以偷偷摸摸的恶劣方式。

最常见的情况是即时事件。当您的代码执行某些操作时,浏览器会立即触发它们:

<textarea id="log" rows="20" cols="40"></textarea>
   <input id="inp">
<script type="text/javascript">
var l= document.getElementById('log');
var i= document.getElementById('inp');
i.onblur= function() {
    l.value+= 'blur\n';
};
setTimeout(function() {
    l.value+= 'log in\n';
    l.focus();
    l.value+= 'log out\n';
}, 100);
i.focus();
   </script>

登录,模糊,注销除IE以外的所有内容。这些事件不会直接触发,因为你直接调用了focus(),因为你调用了alert(),或者打开了一个弹出窗口,或者任何移动焦点的东西,都可能发生这些事件。

这也可能导致其他事件。例如,在focus()调用取消对象之前添加一个i.onchange监听器并在输入中键入内容,并且日志顺序是登录,更改,模糊,注销,除非在Opera中登录,模糊,注销,更改和IE浏览器,更改,注销,模糊。

同样地,在提供它的元素上调用click()会立即在所有浏览器中调用onclick处理程序(至少这是一致的!)。

(我在这里使用了直接on ...事件处理程序属性,但addEventListener和attachEvent也是如此。)

还有一些情况可以在代码被线程化的情况下触发事件,尽管你没有做任何事情来激发它。一个例子:

      <textarea id="log" rows="20" cols="40"></textarea>
       <button id="act">alert</button>
       <script type="text/javascript">
      var l= document.getElementById('log');
        document.getElementById('act').onclick= function() {
      l.value+= 'alert in\n';
      alert('alert!');
       l.value+= 'alert out\n';
      };
      window.onresize= function() {
        l.value+= 'resize\n';
      };

点击警报,你就会得到一个模态对话框。在您解除对话之前不再执行脚本,是吗?不。调整主窗口的大小,您将在textarea中收到提醒,调整大小,提醒。

您可能认为在模式对话框启动时调整窗口大小是不可能的,但不是这样:在Linux中,您可以根据需要调整窗口大小;在Windows上它并不是那么容易,但是你可以通过将屏幕分辨率从较大的屏幕分辨率更改为较小的屏幕分辨率来实现,这会使窗口不适合调整大小。

你可能会想,嗯,只有当用户没有与浏览器进行主动交互时才会调整大小(可能还有一些像滚动),因为脚本是有线程的。对于单个窗口,您可能是对的。但是,只要你进行跨窗口脚本编写,这一切都会进入底池。对于Safari之外的所有浏览器,当其中任何一个窗口/标签/框架忙时,它们会阻止所有窗口/标签/框架,您可以从另一个文档的代码中与文档交互,在单独的执行线程中运行并导致任何相关的事件处理程序火。

当脚本仍处于线程状态时,可以引发可以导致生成事件的位置:

当模态弹出窗口(alert,confirm,prompt)打开时,除了Opera之外的所有浏览器; 在showModalDialog期间支持它的浏览器; “此页面上的脚本可能正忙...”对话框,即使您选择让脚本继续运行,也可以调整调整大小和模糊等事件,即使脚本处于中间位置也可以处理忙碌循环,除了Opera。 不久前,对于我来说,在使用Sun Java插件的IE中,调用applet上的任何方法都可以允许触发事件并重新输入脚本。这总是一个对时间敏感的错误,而Sun可能已经修复了它(我当然希望如此)。 可能更多。自从我测试了它以来,已经有一段时间了,浏览器从那时起就变得复杂了。 总之,大多数用户在大多数时候都会看到JavaScript具有严格的事件驱动的单个执行线程。实际上,它没有这样的东西。目前尚不清楚这有多少只是一个错误和多少刻意的设计,但如果你正在编写复杂的应用程序,特别是跨窗口/框架脚本的应用程序,那么它有可能咬你 - 而且间歇性的,难以调试的方式。

如果最糟糕的情况发生,您可以通过间接所有事件响应来解决并发问题。当一个事件进入时,将其放入一个队列中,然后在setInterval函数中按顺序处理该队列。如果您正在编写一个您打算被复杂应用程序使用的框架,那么这样做可能是一个很好的举措。 postMessage也有望缓解未来跨文档脚本的痛苦。

答案来自此链接: Is JavaScript guaranteed to be single-threaded?