GVKun编程网logo

javascript – Node.js和Comet(node.js和javascript的区别)

15

关于javascript–Node.js和Comet和node.js和javascript的区别的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于javascriptcontains和com

关于javascript – Node.js和Cometnode.js和javascript的区别的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系_javascript技巧、javascript document.compatMode兼容性_javascript技巧、JavaScript Nodejs和MongoDB的简单示例、JavaScript NodeTree导航栏(菜单项JSON类型/自制)_javascript技巧等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

javascript – Node.js和Comet(node.js和javascript的区别)

javascript – Node.js和Comet(node.js和javascript的区别)

基本上,我试图从头开始使用node.js建立一个基本的彗星服务器和客户端.一个尝试谷歌的事情它应该工作的过程,因为我正在测试它似乎工作正常.然而,一个问题仍在我脑海中.首先,我想向您展示代码.
var http = require('http');
var sys = require('sys');
var fs = require('fs');
var qs = require('querystring');

var server = http.createServer();

var connections = [];

server.on('request',function(req,res) {

    console.log(req.url);

    if(req.url == '/index') {

        fs.readFile(__dirname + '/index.html',function(err,data){
            if(err) {
                res.writeHead(err,data);
                return res.end('Error loading index.html');
            }

            res.writeHead(200);
            res.end(data);
        });
    } else if(req.url == '/sendData') {
        if (req.method == 'POST') {
            var body = '';
            req.on('data',function (data) {
                body += data;
            });
            req.on('end',function () {

                var POST = qs.parse(body);
                console.log(POST);
                res.writeHead(200);
                res.end("");
                broadcastData(POST);
            });
        }

    } else {
        connections.push(res);
    }
});

function broadcastData(data) {
    for(var i = 0; i < connections.length; i++) {
        connections[i].writeHead(200);
        connections[i].end(JSON.stringify({'message': data}));
    }
}

process.openStdin().addListener('data',function(chunk) {
    for(var i = 0; i < connections.length; i++) {
        connections[i].writeHead(200);
        var message = chunk.toString();
        connections[i].end(JSON.stringify({'message': {'name': message}}));
    }
});

server.listen(4000);

客户方:

function doComet() {
    $.getJSON('/',function(events){
        doComet();
        console.log(events);
        $('#content').append(events.message.name);
    });
}

function sendData(data) {
    $.ajax({
        type: "POST",url: "/sendData",contentType: 'application/javascript; charset=UTF-8',data: { name: "John",location: "Boston" }
    }).done(function( msg ) {
        console.log(msg)
    });
}

所以有一个监听器发送我在stdin上写的数据,并且客户端也有一个按钮,它将数据发送到服务器,服务器将它发送给所有客户端.

我的问题是如果很多事件在很短的时间内发生了怎么办?我的意思是,一旦响应从服务器获得另一个ajax请求被发送,但是当客户端尚未连接时应该有很短的时间,并且如果在此期间发生某些事情,则客户端将不具有新数据.

那么我的想法是对的吗?在这种情况下,我应该以适当的方式同步数据,以确保每个人都能得到它.有人知道如何正确地做到这一点吗?

谢谢你的帮助!

解决方法

Comet是所有旧的基于HTTP的黑客的总称,是我们想要摆脱的一个短语. WebSockets是我们想要的地方;浏览器及其他.因此,如果您对构建实时解决方案感兴趣,那么您应该首先调查WebSockets,然后处理诸如HTTP Streaming和HTTP Long-Polling之类的后退.有关更多信息,请参阅 Realtime Web Technology Transport Mechanisms.

您提供的示例将被归类为HTTP长轮询.

what if a lot of events happen in a really short amount of time? I mean as soon as a response got from the server another ajax request is sent but there should be a short amount of time when the client is not connected yet and if happens something during that time the client will not have the fresh data

这是HTTP长轮询的一个限制,以及为什么HTTP Streaming是一个更好的解决方案,而WebSockets仍然更好 – 在发送数据时不会关闭连接.使用任何类型的轮询解决方案,您可能需要一种解决方案,以确保轮询客户端不会错过轮询请求期间收到和发送的消息.

有几个解决方案:

>使用会话来跟踪发送到特定客户端的最后一条消息.当他们重新连接时,检查上次发送的消息,哪些消息已丢失并发送.
>作为客户端轮询的一部分,发送lastMessageId.当服务器收到此信息时,您可以检查这是否是最后一条消息.如果没有,您可以回复任何错过的消息.

实时Web技术的复杂性之一是处理所有可能的连接方案.所以,如果你这样做是一种学习经历,那么它肯定是有益的,也是有趣的.但是,如果您要创建一个应用程序以进入生产,我会建议现有的实时框架.见realtime web tech guide.

javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系_javascript技巧

javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系_javascript技巧

从那起,我已经对这些方法做了大量的研究,并且已经在很多场合使用他们。在很多任务中,他们被证明是非常有用的(特别关于结构的抽象 DOM 选择器)。
1、DOMElement.contains(DOMNode)
这个方法起先用在 IE ,用来确定 DOM Node 是否包含在另一个 DOM Element 中。
当尝试优化 CSS 选择器遍历(像:“#id1 #id2”),这个方法很有用。你可以通过 getElementById 得到元素,然后使用 .contains() 确定 #id1 实际上是否包含 #id2。
注意点:如果 DOM Node 和 DOM Element 相一致,.contains() 将返回 true ,虽然,一个元素不能包含自己。
这里有一个简单的执行包装,可以运行在:Internet Explorer, Firefox, Opera, and Safari。

复制代码 代码如下:

function contains(a, b) {
return a.contains ? a != b && a.contains(b) : !!(a.compareDocumentPosition(arg) & 16);
}


2、NodeA.compareDocumentPosition(NodeB)
这个方法是 DOM Level 3 specification 的一部分,允许你确定 2 个 DOM Node 之间的相互位置。这个方法比 .contains() 强大。这个方法的一个可能应用是排序 DOM Node 成一个详细精确的顺序。
使用这个方法你可以确定关于一个元素位置的一连串的信息。所有的这些信息将返回一个比特码(Bit,比特,亦称二进制位)。
对于那些,人们知之甚少。比特码是将多重数据存储为一个简单的数字(译者注:0 或 1)。你最终打开 / 关闭个别数目(译者注:打开/关闭对应 0 /1),将给你一个最终的结果。
这里是从 NodeA.compareDocumentPosition(NodeB) 返回的结果,包含你可以得到的信息。
Bits Number Meaning
000 0 元素一致
001 1 节点在不同的文档(或者一个在文档之外)
010 2 节点 B 在节点 A 之前
100 4 节点 A 在节点 B 之前
000 8 节点 B 包含节点 A
000 16 节点 A 包含节点 B
000 32 浏览器的私有使用
现在,这意味着一个可能的结果类似于:
复制代码 代码如下:




<script> <BR>alert( document.getElementById("a").compareDocumentPosition(document.getElementById("b")) == 20); <BR></script>

一旦一个节点 A 包含另一个节点 B,包含 B(+16) 且在 B 之前(+4),则最后的结果是数字 20 。如果你查看比特发生的变化,将增加你的理解。
100 (4) + 010000 (16) = 010100 (20)
这个,毫无疑问,有助于理解单个最混乱的 DOM API 方法。当然,他的价值当之无愧的。
现在,DOMNode.compareDocumentPosition 在 Firefox 和 Opera 中是可用的。然而,有一些技巧,我们可以用来在 IE 中执行他。
复制代码 代码如下:

// Compare Position - MIT Licensed, John Resig
function comparePosition(a, b){
return a.compareDocumentPosition ?
a.compareDocumentPosition(b) :
a.contains ?
( a != b && a.contains(b) && 16 ) +
( a != b && b.contains(a) && 8 ) +
( a.sourceIndex >= 0 && b.sourceIndex >= 0 ?
(a.sourceIndex (a.sourceIndex > b.sourceIndex && 2 ) :
1 ) :
0;
}

IE 提供给我们一些可以使用的方法和属性。开始,使用 .contains() 方法(如我们前面所讨论的),以便给我们包含(+16)或者被包含(+8)的结果。IE 还有一个 .sourceIndex 属性在所有的 DOM Element 对应着元素在文档中的位置,例如:document.documentElement.sourceIndex == 0。因为我们有这个信息,我们可以完成两个 compareDocumentPosition 难题:在前面(+2)和在后面(+4)。另外,如果一个元素不在当前的文档,.sourceIndex 将等于 -1,这个给我们另外一个回答(+1)。最后,通过这个过程的推断,我们可以确定如果一个元素等于他本身,返回一个空的比特码(+0)。
这个函数可以在 Internet Explorer、Firefox 和 Opera 中运行。但在 Safari 中却有残缺功能(因为他只有 contains() 方法,而没有 .sourceIndex 属性。我们只能得到 包含(+16),被包含(+8),其他的所有结果都将返回(+1)代表一个断开)。
PPK 提供了一个关于通过创建一个 getElementsByTagNames 方法使新功能可以被使用的很棒的例子。让我们改编他到我们的新方法中:
复制代码 代码如下:

// Original by PPK quirksmode.org
function getElementsByTagNames(list, elem) {
elem = elem || document;
var tagNames = list.split('',''), results = [];

for ( var i = 0; i var tags = elem.getElementsByTagName( tagNames[i] );
for ( var j = 0; j results.push( tags[j] );
}

return results.sort(function(a, b){
return 3 - (comparePosition(a, b) & 6);
});
}


我们现在可以使用他来按次序构建一个站点的目录:
getElementsByTagNames("h1, h2, h3");
虽然 Firefox 和 Opera 都采取了一些主动落实这一方法。我依然期待看到更多的浏览器进入,以帮助向前推动

javascript document.compatMode兼容性_javascript技巧

javascript document.compatMode兼容性_javascript技巧

IE对盒模型的渲染在 Standards Mode和Quirks Mode是有很大差别的,在Standards Mode下对于盒模型的解释和其他的标准浏览器是一样,但在Quirks Mode模式下则有很大差别,而在不声明Doctype的情况下,IE默认又是Quirks Mode。所以为兼容性考虑,我们可能需要获取当前的文档渲染方式。

document.compatMode正好派上用场,它有两种可能的返回值:BackCompat和CSS1Compat。

BackCompat:标准兼容模式关闭。浏览器客户区宽度是document.body.clientWidth;CSS1Compat:标准兼容模式开启。 浏览器客户区宽度是document.documentElement.clientWidth。

那么写了个准确获取网页客户区的宽高、滚动条宽高、滚动条Left和Top的代码:

复制代码 代码如下:

if (document.compatMode == "BackCompat") {
cWidth = document.body.clientWidth;
cHeight = document.body.clientHeight;
sWidth = document.body.scrollWidth;
sHeight = document.body.scrollHeight;
sLeft = document.body.scrollLeft;
sTop = document.body.scrollTop;
}
else { //document.compatMode == "CSS1Compat"
cWidth = document.documentElement.clientWidth;
cHeight = document.documentElement.clientHeight;
sWidth = document.documentElement.scrollWidth;
sHeight = document.documentElement.scrollHeight;
sLeft = document.documentElement.scrollLeft == 0 ? document.body.scrollLeft : document.documentElement.scrollLeft;
sTop = document.documentElement.scrollTop == 0 ? document.body.scrollTop : document.documentElement.scrollTop;
}

JavaScript Nodejs和MongoDB的简单示例

JavaScript Nodejs和MongoDB的简单示例

感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编来看看吧。
学习了一下Nodejs和MongoDB,写了个示例程序,读取数据库中产品的列表。 JS代码如下:

/**
 * Nodejs和MongoDB的简单示例
 *
 * @param 
 * @arrange (小编) jb51.cc
 **/
var http = require(http),mongo = require(mongodb),events = require(events);
 
http.createServer(function(req,res) {
 
  var products_emitter = new events.EventEmitter(),// 创建到northwind数据库的链接。相当于use northwind
      db = new mongo.Db(northwind,new mongo.Server('localhost',27017,{}),{});
   
  var listener = function(products) {
      var html = [],len = products.length;
      html.push('<!DOCTYPE html>');
      html.push('<html>');
      html.push('<head>');
      html.push('<title>Nodejs</title>');
      html.push('</head>');
      html.push('<body>');   
      if(len > 0) {
        html.push('<ul>');          
        for(var i = 0; i < len; i++) {
          html.push('<li>' + products[i].name + '</li>');
        }
        html.push('</ul>');
      }
      html.push('</body>');
      html.push('</html>');
       
      res.writeHead(200,Content-Type: text/html);
      res.write(html.join(''));
      res.end();
       
      clearTimeout(timeout);
  }
  products_emitter.on('products',listener);
   
  var timeout = setTimeout(function() {
      products_emitter.emit('products',[]);
      products_emitter.removeListener('products',listener);
  },10000);
           
  db.open(function() {
      // 打开名为products的表
    db.collection(products,function(err,collection) {
        // select * from products 相当于db.products.find()
      collection.find(function(err,cursor) {
        cursor.toArray(function(err,items) {
          products_emitter.emit('products',items);
        });
      });
    });
  });
   
}).listen(8000);
 
console.log(Started);

JavaScript NodeTree导航栏(菜单项JSON类型/自制)_javascript技巧

JavaScript NodeTree导航栏(菜单项JSON类型/自制)_javascript技巧

最近比较清闲,自己做了个JavaScript NodeTree,网上类似的东西其实挺多的,功能也比这个全,我做这个纯粹为了练练手。

图标可以自定义(16X16),菜单项完全是JSON类型定义的,方便修改。
界面
JavaScript NodeTree导航栏(菜单项JSON类型/自制)_javascript技巧
使用方法
1、将NodeTree-JSON.js以及CSS文件夹复制到项目中并引用。
2、引用JQuery框架。
3、修改NodeTree-JSON.js中的NodeTreeMenu菜单项,以下是简单说明。

复制代码 代码如下:

var NodeTreeMenu = [
//id:节点ID,pId:父节点Id,没有父节点则为0,name:显示名称,img:显示图标,open:只有父节点存在此属性,子节点默认是否展开,file:只有子节点由此属性,点击后打开的页面
{ id: 1, pId: 0, name: "父节点一", img: "CSS/Images/001.png", open: true },
{ id: 101, pId: 1, name: "子节点一", img: "CSS/Images/002.png", file: "http://www.cnblogs.com/nnzfly/" }//注意最后一行数据末尾一定不能加逗号!否则IE下报错!
]

4、在要显示NodeTree的地方添加如下代码:
复制代码 代码如下:




5、在页面中添加如下代码:
复制代码 代码如下:

或者是(二者任选其一):



NodeTree("mainFrame") 中,mainFrame是目标frame的name,比如说导航栏在左边的frame里,右边显示的frame的name=“mainFrame”。
实在不理解看看demo.htm的代码,就明白了。
附上源代码,感兴趣的可以看看~
http://dl.vmall.com/c0b7wda1ps
喜欢请点一下推荐,你的支持是我最大的动力!

今天关于javascript – Node.js和Cometnode.js和javascript的区别的介绍到此结束,谢谢您的阅读,有关javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系_javascript技巧、javascript document.compatMode兼容性_javascript技巧、JavaScript Nodejs和MongoDB的简单示例、JavaScript NodeTree导航栏(菜单项JSON类型/自制)_javascript技巧等更多相关知识的信息可以在本站进行查询。

本文标签: