www.91084.com

GVKun编程网logo

使用 web.py(使用 webdav 搭建局域网文件共享)

17

此处将为大家介绍关于使用web.py的详细内容,并且为您解答有关使用webdav搭建局域网文件共享的相关问题,此外,我们还将为您介绍关于CORS–使用AJAX在Python(webapp2)Web服务

此处将为大家介绍关于使用 web.py的详细内容,并且为您解答有关使用 webdav 搭建局域网文件共享的相关问题,此外,我们还将为您介绍关于CORS – 使用AJAX在Python(webapp2)Web服务上发布、Dweb:使用WebRTC / WebTorrent构建弹性Web、HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(上) ...、HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(下) ...的有用信息。

本文目录一览:

使用 web.py(使用 webdav 搭建局域网文件共享)

使用 web.py(使用 webdav 搭建局域网文件共享)

如何解决使用 web.py?

我有 2 页。索引和索引2。我不确定如何提供 web.py 2 GET 函数或强制 python 显示 1 页,然后重定向。 它们都只是在运行并连接到本地。

方法一

我在下面的示例中尝试只渲染,但除非我返回它,否则 render.index() 什么也不做。

render = web.template.render(''templates/'')
urls = (
  ''/'',''index'',''index2''
)

class index:
    def GET(self):
        render.index()   ### this first render does nothing

        return render.index2()

if __name__ == "__main__":
    app = web.application(urls,globals())
    app.run()

这个方法从不显示第一个索引

方法 2

2 个独立的服务器,第一个显示索引 1,索引 1 有一些 javascript 将其重定向到第二页。 (maina.py 显示 index1 并在端口 7777 上运行,还有 mainb.py 显示 index2 并在 7778 上运行)尝试重定向到第二页时,此方法会引发错误。

index1.html javascript

<script type="text/javascript">window.location.href = "127.0.0.1:7778";  </script>

main.py

render = web.template.render(''1/'')
urls = (
  ''/'',''index2''
)
class index:
    def GET(self):
        return render.index()   
if __name__ == "__main__":
    app = web.application(urls,globals())
    app.run()

mainb.py

render = web.template.render(''1/'')
urls = (
  ''/'',''index2''
)
class index2:
    def GET(self):
        return render.index2()   
if __name__ == "__main__":
    app = web.application(urls,globals())
    app.run()

错误如下。

错误:

for pat,what in mapping:
    ValueError: not enough values to unpack (expected 2,got 1)

(ps。我的索引都不需要变量,即我没有使用模板,它只是一个普通的 html)

如何让 python 渲染 1 个页面,然后再渲染另一个页面?

编辑:这真的不可能吗?我一直在四处打听,但没有得到直接的答案。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

CORS – 使用AJAX在Python(webapp2)Web服务上发布

CORS – 使用AJAX在Python(webapp2)Web服务上发布

这将是很长的:

好的,我正在开发一个谷歌日历小工具,它将请求发送到托管在Google App Engine上的Python webapp2 REST api.

当我尝试发布因CORS而不允许我的东西时出现问题.
在Chromes的DevTools中它说:

Method: OPTIONS.

Status: (Failed) Request header field Content-Type is not allowed by Access-Control-Allow-Headers.

Origin https://hq34i4geprnp5vci191ljfuhcoerscl4-a-calendar-opensocial.googleusercontent.com is not allowed by Access-Control-Allow-Origin. 

我知道这是因为CORS.这里:

Ajax – ‘Origin localhost is not allowed by Access-Control-Allow-Origin’

它说我必须添加

Access-Control-Allow-Origin: *

对于标题,但是我又是ajax的新手,我想知道它是否以这种方式完成:

    $.ajax({
        type: "POST",
        url: "https://myapp.appspot.com/service",
        contentType: "application/json; charset=utf-8",
        data: data,
        beforeSend: function (request)
        {
            request.setRequestHeader("Access-Control-Allow-Origin", "*");
        }
        success: function(data) {
              alert("AJAX done");
        }
    });

添加此标题的输出是不同的(这让我想知道原点是否被允许,但我真的不知道):

Method: OPTIONS.

Status: (Failed) Request header field Content-Type is not allowed by Access-Control-Allow-Headers.

XMLHttpRequest cannot load https://myapp.appspot.com/service. Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers. 

我甚至发现了这个:

http://james.padolsey.com/javascript/cross-domain-requests-with-jquery/

这让我可以做GET请求,但我想学习如何在没有这个的情况下完成它们.

同样在我的网络服务器上,我有这个:

...
    class webService(webapp2.RequestHandler):
         options(self):
               self.response.write('options')

         post(self):
               self.response.write('post')

    application = webapp2.WsgiApplication([
        ('/', MainPage),
        ('/service', webService)
    ], debug=True)

我不知道是否必须向网络服务器添加更多内容,我也没有找到信息说我必须这样做.
此外,我认为我即将实现CORS请求,但是,我找不到解释这一切的示例.

请帮忙.

解决方法:

好的,我修好了.

首先,我意识到here标头是由服务器发送的,所以我在AJAX请求中发送这些标头时做错了.

最后,在搜索了全球网络后,我发现了我所缺少的内容.这是愚蠢的事情.我找到了修复它的页面:

http://enable-cors.org/server_appengine.html

所以最后一切看起来像这样:

$.ajax({
    type: "POST",
    url: "https://myapp.appspot.com/service",
    contentType: "application/json; charset=utf-8",
    data: data,
    success: function(data) {
        alert("AJAX done");
    }
});  

并在webService中:

class webService(webapp2.RequestHandler):

    def get(self):      
        self.response.headers.add_header('Access-Control-Allow-Origin', '*')
        self.response.headers['Content-Type'] = 'application/json'
        # do something

    def post(self):     
        self.response.headers.add_header('Access-Control-Allow-Origin', '*')
        self.response.headers['Content-Type'] = 'application/json'
        # do something

    def options(self):      
        self.response.headers['Access-Control-Allow-Origin'] = '*'
        self.response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'
        self.response.headers['Access-Control-Allow-Methods'] = 'POST, GET, PUT, DELETE'

Dweb:使用WebRTC / WebTorrent构建弹性Web

Dweb:使用WebRTC / WebTorrent构建弹性Web


本文来自WebTorrent的创始人、PeerCDN联合创始人Feross Aboukhadijeh,他介绍了一种基于WebRTC通信的Web协议WebTorrent,通过WebTorrent可以节省服务器资源,降低成本。LiveVideoStack对原文进行了摘译。


文 / Feross Aboukhadijeh

译 / 元宝

审校 / Ant

原文:

https://hacks.mozilla.org/2018/08/dweb-building-a-resilient-web-with-webtorrent/


WebTorrent是一种在Web浏览器中运行的BitTorrent协议的实现。这种服务文件的方法意味着,网站可以与尽可能多的用户进行扩展,同时浏览网站,从而消除在数据中心运行集中服务器的成本。本文由Feross Aboukhadijeh撰写,他是WebTorrent的创始人和PeerCDN的联合创始人,也是一位多产的NPM模块作者......最终统计有225个模块!-Dietrich Ayala


什么是WebTorrent?


WebTorrent是第一个在浏览器中工作的种子客户端。它完全由JavaScript编写,并使用WebRTC进行真正的点对点传输。无需浏览器插件,扩展或安装。


使用开放式Web标准,WebTorrent将网站用户连接在一起,形成分布式的和分散式的浏览器到浏览器网络,以实现高效的文件传输。使用基于WebTorrent的网站的人越多,它就越快,越有弹性。


架构


WebTorrent协议就像BitTorrent协议一样,除了它使用的是WebRTC而不是TCP或uTP作为传输协议。


为了支持WebRTC的连接模型,我们对跟踪器协议进行了一些更改。因此,基于浏览器的WebTorrent客户端或“web peer”只能连接到支持WebTorrent / WebRTC的其他客户端。


一旦连接对等体后,用于通信的有线协议与正常的BitTorrent就完全相同。这应该使现有流行的torrent客户端如Transmission和uTorrent更容易添加对WebTorrent的支持。Vuze已经支持WebTorrent了!



入门


只需几行代码即可在浏览器中下载torrent!


要开始使用WebTorrent,只需在页面上包含webtorrent.min.js脚本即可。你可以从WebTorrent网站下载脚本或链接到CDN副本。


<script src="webtorrent.min.js"></script>


这为窗口对象提供了一个WebTorrent函数。还有一个npm包可用。


var client = new WebTorrent()

// Sintel, a free, Creative Commons movie
var torrentId = ''magnet:...'' // Real torrent ids are much longer.

var torrent = client.add(torrentId)

torrent.on(''ready'', () => {
// Torrents can contain many files. Let''s use the .mp4 file
var file = torrent.files.find(file => file.name.endsWith(''.mp4''))

// Display the file by adding it to the DOM.
// Supports video, audio, image files, and more!
file.appendTo(''body'')
})


就是这样的!现在,你将看到BT流进入到标签为<video width="300" height="150">的网页中!


更多


你可以浏览webtorrent.io或者在Freenode IRC或Gitter上的#webtorrent中提问来了解更多信息。我们正在寻找更多能够在GitHub问题跟踪器上回答问题并帮助解决问题的人。如果你是一个友善,乐于助人的人,并想乘机深入挖掘洪流协议或WebRTC,那么这就是你的机会!



本文分享自微信公众号 - LiveVideoStack(livevideostack)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(上) ...

HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(上) ...

       一直以来,Web 应用程序被局限在一个单线程世界中。这的确限制了开发人员在他们的代码中的作为,因为任何太复杂的东西都存在冻结应用程序 UI 的风险。通过将多线程引入 Web 应用程序,Web Workers 扭转了这一不利局面。这对于大部分应用程序逻辑都位于客户端的移动 Web 应用程序来说尤其有用。在本文中,您将了解如何使用 Web Workers 并发现哪些任务最适合它们。您还将看到如何使用其他 HTML 5 技术才能提高使用那些技术的效率。

       开始

       在本文中,您将使用最新的 Web 技术开发 Web 应用程序。这里的大部分代码只是 HTML、JavaScript 和 CSS — 所有 Web 开发人员的核心技术。所需的最重要的工具是用于进行测试的浏览器。本文大部分代码将在最新桌面浏览器上运行,但也有一些例外,我们将在文章中进行说明。当 然,您也必须在移动浏览器上测试,为此,您需要最新的 iPhone 和 Android SDKs。本文将使用 iPhone SDK 3.1.3 和 Android SDK 2.1。本文的样例还将使用一个代理服务器来从浏览器访问远程服务。这个代理服务器是一个简单的 Java™ servlet,但也可以使用以 PHP、Ruby 以及其他语言编写的代理轻松替换。获取链接。

       移动设备上的多线程 JavaScript

       对于大多数开发人员来说,多线程或并发编程并不新鲜。但是,JavaScript 并不是一种支持并发编程的语言。JavaScript 的创建者认为,对于 JavaScript 这样旨在 Web 页面上执行简单任务的语言来说,并发编程容易出现问题,而且没有必要。然而,由于 Web 页面已经发展成为 Web 应用程序,使用 JavaScript 完成的任务的复杂程度已经大大增加,向 JavaScript 提出了与其他语言同等的要求。与此同时,使用其他支持并发编程的语言工作的开发人员经常面临伴随线程和 mutexes 这样的并发原语而来的超高复杂性的困扰。实际上,最近像 Scala、Clojure 和 F# 这样的几种新语言已经发展,它们都有可能简化并发性。

       Web Worker 规范不只是向 JavaScript 和 Web 浏览器添加并发性,而且是以一种智慧的方式添加,这种方式将增加开发人员的能力,但不会向他们提供一种会导致问题的工具。 例如,多年来,桌面应用程序开发人员一直在使用多线程来支持他们的应用程序访问多个 I/O 资源,以避免在等待这些资源时冻结 UI。然而,当这些多线程更改共享的资源(包括 UI)时,这样的应用程序通常会出现问题,因为这种行为可能会导致应用程序冻结或崩溃。有了 Web Workers,这种情况就不会发生。衍生线程不能访问主 UI 线程访问的资源。事实上,衍生线程中的代码甚至不能与主 UI 线程执行的代码位于同一个文件中。

       您甚至必须提供相应的外部文件作为构造函数的一部分,如 清单 1 所示。

       这个进程使用三个资源:

  1. 在主线程上执行的 Web 页面 JavaScript(我称其为页面脚本)。
  2. Worker 对象,这是用于执行 Web Worker 函数的 JavaScript 对象。
  3. 将在新衍生的线程上执行的脚本。我称其为 Worker 脚本

      让我们首先看看 清单 1 中的页面脚本。

立即学习“前端免费学习笔记(深入)”;

清单 1.在页面脚本中使用一个 Web Worker

var worker = new Worker("worker.js");
worker.onmessage = function(message){
    // do stuff
};
worker.postMessage(someDataToDoStuffWith);
登录后复制

在 清单 1 中,您可以看到使用 Web Workers 的三个基本步骤。首先,您创建一个 Worker 对象并向它传递将在新线程中执行的脚本的 URL。Worker 将执行的所有代码都必须包含在一个 Worker 脚本中,该脚本的 URL 将被传递到这个 Worker 的构造函数中。这个 Worker 脚本的 URL 受到浏览器的同源策略的限制 — 它必须来自加载这个页面的同一个域,该页面已加载正在创建这个 Web Worker 的页面脚本。

下一步是使用 onmessage 函数指定一个回调处理器函数。这个回调函数将在该 Worker 脚本执行后调用。message 是从该 Worker 脚本返回的数据,您可以随意处理该消息。回调函数在主线程上执行,因此它能访问 DOM。Worker 脚本在一个不同的线程内运行且不能访问 DOM,因此,您需要将来自这个 Worker 脚本的数据返回主线程,在那里,您可以安全地修改 DOM 来更新您的应用程序的 UI。这是 Web Workers 的无共享设计的关键特性。

清单 1 中的最后一行展示如何通过调用 Worker 的 postMessage 函数来启动它。这里,您传递一条消息(重申一下,它只是数据)给 Worker。当然,postMessage 是一个异步函数;您调用它,它就立即返回。

现在,检查这个 Worker 脚本。清单 2 中的代码是来自 清单 1 的 worker.js 文件的内容。

清单 2. 一个 Worker 脚本

importScripts("utils.js");
var workerState = {};
onmessage = function(message){
     workerState = message.data;
      // do stuff with the message
    postMessage({responseXml: this.responseText});
}
登录后复制

可以看到,这个 Worker 脚本拥有自己的 onmessage 函数。该函数在您从主线程调用 postMessage 时调用。从页面脚本传来的数据被传递到 message 对象中的 postMessage 函数。您通过检索 message 对象的 data 属性来访问该数据。当您处理完 Worker 脚本中的数据时,调用 postMessage 函数将数据返回主线程。主线程也可以通过访问它接收到的消息的 data 属性来访问该数据。

至此,您已经见识了 Web Workers 的这个简单、但强大的语义。接下来,您将了解如何应用这个语义来加速移动 Web 应用程序。在此之前,有必要先讨论一下设备支持。毕竟,这些是移动 Web 应用程序,且处理不同浏览器之间的功能的区别对于移动 Web 应用程序开发很重要。

设备支持

从 Android 2.0 开始,Android 浏览器就拥有了对 HTML 5 Web Worker 规范的全面支持。在撰写本文之时,最新的 Android 设备(包括非常流行的 Motorola Droid)已配置了 Android 2.1。另外,此特性在运行 Maemo 操作系统的 Nokia 设备上的 Mozilla Fennec 浏览器以及 Windows Mobile 设备上受到完全支持。这里需要引起注意的遗漏是 iPhone。iPhone OS 3.1.3 和 3.2 版(在 iPad 上运行的 OS 的版本)并不支持 Web Workers。但是,此特性已在 Safari 上受到支持,因此,此特性在运行在 iPhone 上的 Mobile Safari 浏览器上出现应该只是一个时间问题。鉴于 iPhone 的主导地位(尤其是在美国),最好不要依赖 Web Workers 的存在,且不要只在您检测到它们的存在时才使用它们来增强您的移动 Web 应用程序。意识到这一点后,我们来看看如何使用 Web Workers 来加速您的移动 Web 应用程序。

 

使用 Workers 改善性能

智能手机浏览器上的 Web Worker 支持很不错,而且一直在不断改进。这就提出了一个问题:什么时候需要在移动 Web 应用程序中使用 Workers?答案很简单:需要完成耗时的任务的任何时候。有些示例展示了如何将 Workers 用于执行密集的数学计算,比如计算 1 万位数的圆周率。很可能您永远也不需要在 Web 应用程序上执行这样一个计算,在移动 Web 应用程序上执行这种计算的几率则更小。但是,从远程资源检索数据则相当常见,这也是本文示例的关注点。

在这个示例中,您将从 eBay 检索一个 Daily Deals(每天都在变化的交易)列表。这个交易列表包含关于每笔交易的简短信息。更详细的信息可以通过使用 eBay 的 Shopping API 获取。当用户浏览这个交易列表选择感兴趣的商品时,您将使用 Web Workers 来预取这个附加信息。要从您的 Web 应用程序访问所有这些 eBay 数据,您需要通过使用一个泛型代理(generic proxy)来处理浏览器的同源策略。一个简单的 Java servlet 将用于这个代理,它包含在本文的代码中,但不在这里单独展示。相反,我们将把注意力集中在处理 Web Workers 的代码上。清单 3 展示了这个交易应用程序的基本 HTML 页面。

清单 3. 交易应用程序 HTML

  
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta name="viewport" content="width = device-width"><title>Worker Deals</title><script type="text/javascript" src="common.js"></script><h1>Deals</h1>
    <ol id="deals"></ol><h2>More Deals</h2>
    
登录后复制

    可以看出,这是一段非常简单的 HTML;它只是一个 shell。您使用 JavaScript 检索数据并生成 UI。这是移动 Web 应用程序的优化设计,因为它允许将所有代码和静态标记缓存到设备上,用户只需等待来自服务器的数据。注意,在 清单 3 中,一旦那个 body 加载,您就调用 loadDeals 函数,在那里,您将加载 清单 4 中的应用程序的初始数据。

    HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(下) ...

    HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(下) ...

    清单 4. loaddeals 函数

    var deals = [];
    var sections = [];
    var dealDetails = {};
    var dealsUrl = "http://deals.ebay.com/feeds/xml";
    function loadDeals(){
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){
            if (this.readyState == 4 &amp;&amp; this.status == 200){
                   var i = 0;
                   var j = 0;
                   var dealsXml = this.responseXML.firstChild;
                   var childNode = {};
                   for (i=0; i
    <p>清单 4 展示了 loadDeals 函数,以及应用程序中使用的全局变量。您使用了一个 deals 数组和一个 sections 数组。它们是相关交易的附加组(例如,Deals under $10)。还有一个名为 dealDetails 的映射,其键是 Item IDs(来自于交易数据),其值是从 eBay Shopping <a title="API" href="http://www.31358.cn/api/">API</a> 获取的详细信息。 </p>
    <p>您首先调用一个代理,该代理又将调用 eBay Daily Deals REST <a title="API" href="http://www.31358.cn/api/">API</a>。这将把交易列表作为一个 XML 文档提供给您。您解析用于进行 Ajax 调用的 XMLHttpRequest 对象的 onreadystatechange 函数中的文档。您还使用其他两个函数,parseDeal 和 parseSection,来将 XML 节点解析为更易于使用的 JavaScript 对象,但由于它们只是令人厌烦的 XML 解析函数,因此我在这里没有包括它们。最后,在解析了 XML 后,您还使用了另外两个函数,createDealUi 和 createSectionUi,来修改 DOM。此时,这个 UI 如 图 1 所示。 </p>
    <p><a href="http://www.31358.cn/wp-content/uploads/2011/12/image0012.jpg"><imgtitle="image001" alt="image001" src="http://www.31358.cn/wp-content/uploads/2011/12/image001_thumb3.jpg" border="0"></a> </p>
    <p>如果您返回 清单 4,就会注意到在加载主交易之后,您对这些交易的每个部分都调用了 loadDetails 函数。在这个函数中,您通过使用 eBay Shopping API 加载每个交易的附加细节 — 但前提是浏览器支持 Web Workers。清单 5 展示了 loadDetails 函数。 </p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1"rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>
    <p><a name="l5"><b>清单 5. 预取交易细节</b></a></p>
    <pre>function loadDetails(items){
        if (!!window.Worker){
            items.forEach(function(item){
                var xmlStr = null;
                if (window.<a title="localStorage" href="http://www.31358.cn/localtorage/">localStorage</a>){
                    xmlStr = <a title="localStorage" href="http://www.31358.cn/localtorage/">localStorage</a>.getItem(item.itemId);
                }
                if (xmlStr){
                    var itemDetails = parseFromXml(xmlStr);
                    dealDetails[itemDetails.id] = itemDetails;
                } else {
                    var worker = new Worker("details.js");
                    worker.onmessage = function(message){
                        var responseXmlStr =message.data.responseXml;
                        var itemDetails=parseFromXml(responseXmlStr);
                        if (window.localStorage){
                            localStorage.setItem(
                                            itemDetails.id, responseXmlStr);
                        }
                        dealDetails[itemDetails.id] = itemDetails;
                    };
                        worker.postMessage(item.itemId);
                }
            });
        }
    }
    登录后复制

    在 loadDetails 中,您首先检查全局作用域(window 对象)中的 Worker 函数。如果该函数不在那里,那么无需做任何事。反之,您首先检查 XML 的 localStorage 以获取这个交易的细节。这是移动 Web 应用程序常用的本地缓存策略,本系列第 2 部分.详细介绍过这种策略。

    如果 XML 位于本地,那么您在 parseFromXml 函数中解析它并将交易细节添加到 dealDetails 对象。反之,则衍生一个 Web Worker 并使用 postMessage 向其发送 Item ID。当这个 Worker 检索到数据并将数据发布回主线程后,您解析 XML,将结果添加到 dealDetails,然后将 XML 存储到 localStorage 中。清单 6 展示了这个 Worker 脚本:details.js。

    清单 6. 交易细节 Worker 脚本

    importScripts("common.js");
    onmessage = function(message){
        var itemId = message.data;
        var xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function(){
            if (this.readyState == 4 &amp;&amp; this.status == 200){
                postMessage({responseXml: this.responseText});
            }
        };
        var urlStr = generateUrl(itemId);
        xhr.open("GET", "proxy?url=" + escape(urlStr));
        xhr.send(null);
    }
    登录后复制

    这个 Worker 脚本非常简单。您使用 Ajax 调用代理,该代理又调用 eBay Shopping API。当您收到来自代理的 XML 后,使用一个 JavaScript 对象文字(object literal)将其发送回主线程。注意,即使您能够使用来自一个 Worker 的 XMLHttpRequest,但所有信息都将返回它的 responseText 属性,而不是它的 responseXml 属性。这是因为这个 Worker 脚本范围内没有 JavaScript DOM 解析器。注意,generateUrl 函数来自 common.js 文件(见 清单 7)。您使用 importScripts 函数导入 common.js 文件。

    清单 7. Worker 导入的脚本

    function generateUrl(itemId){
        var appId = "YOUR APP ID GOES HERE";
        return "http://open.api.ebay.com/shopping?callname=GetSingleItem&amp;"+
            "responseencoding=XML&amp;appid=" + appId + "&amp;siteid=0&amp;version=665"
                +"&amp;ItemID=" + itemId;
    }
    登录后复制

    现在,您已经知道如何(为支持 Web Workers 的浏览器)填充交易细节,我们返回 图 1 研究一下如何在应用程序中使用这种方法。注意,每笔交易旁边都有一个 Show Details 按钮,单击该按钮修改这个 UI,如 图 2 所示。

    图 2. 显示的交易细节

     

    这个 UI 将在您调用 showDetails 函数时显示。清单 8 展示了这个函数。

    清单 8. showDetails 函数

    function showDetails(id){
        var el = $(id);
        if (el.style.display == "block"){
            el.style.display = "none";
        } else {
            el.style.display = "block";
            if (!el.innerHTML){
                var details = dealDetails[id];
                if (details){
                    var ui = createDetailUi(details);
                    el.appendChild(ui);
                } else {
                    var itemId = id;
                    var xhr = new XMLHttpRequest();
                    xhr.onreadystatechange = function(){
                        if (this.readyState == 4 &amp;&amp;
                                          this.status == 200){
                            var itemDetails =
                                            parseFromXml(this.responseText);
                            if (window.localStorage){
                                localStorage.setItem(
                                                  itemDetails.id,
                                                  this.responseText);
                            }
                            dealDetails[id] = itemDetails;
                            var ui = createDetailUi(itemDetails);
                            el.appendChild(ui);
                        }
                    };
                    var urlStr = generateUrl(id);
                    xhr.open("GET", "proxy?url=" + escape(urlStr));
                    xhr.send(null);
                }
            }
        }
    }
    登录后复制

    您收到了即将显示的交易的 ID 并切换是否显示它。当该函数第一次调用时,它将检查细节是否已经存储到 dealDetails 映射中。如果浏览器支持 Web Workers,那么这些细节已经存储且它的 UI 已经创建并添加到 DOM 中。如果这些细节还没有加载,或者,如果浏览器不支持 Workers,那么您需要执行一个 Ajax 调用来加载此数据。这就是这个应用程序无论在有无 Workers 时都同样能正常工作的原因。这意味着,如果 Workers 受到支持,那么数据就已被加载且 UI 将立即响应。如果没有 Workers,UI 仍将加载,只是需要花费几秒钟时间。

    结束语

    对于 Web 开发人员来说,Web Workers 听起来就像一种外来的新技术。但是,如本文所述,它们是非常实用的应用程序。这对于移动 Web 应用程序来说尤其正确。这些 Workers 可用于预取数据或执行其他预先操作,从而提供一个更加实时的 UI。这对于需要通过网速可能较慢的网络加载数据的移动 Web 应用程序来说尤其正确。结合使用这种技术和缓存策略,您的应用程序的快捷反应将使您的用户感到惊喜!

    今天关于使用 web.py使用 webdav 搭建局域网文件共享的介绍到此结束,谢谢您的阅读,有关CORS – 使用AJAX在Python(webapp2)Web服务上发布、Dweb:使用WebRTC / WebTorrent构建弹性Web、HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(上) ...、HTML5 WebApp part4:使用 Web Workers 来加速您的移动 Web 应用程序(下) ...等更多相关知识的信息可以在本站进行查询。

    本文标签:

    上一篇Chrome浏览器中的Selenium在线程“main”org.openqa.selenium.WebDriverException中显示异常:等待驱动程序服务器启动超时

    下一篇D365 自定义 JS Web 资源 - ReferenceError:Web 资源方法不存在:preFilterLookup(web资源库)