2013-10-22 69 views
0

我在JavaScript和HTML中只有两天的时间。我使用C代码创建了一个命名管道,并且可以将字符写入其中。命名管道显示为名为“xyz”的文件。现在我正在尝试使用HTML + JavaScript阅读此文件,并访问这些字符。我想检查该命名管道文件中字符'c'的出现。 我现在正在使用来自Ubuntu终端的echo命令写入“xyz”。 我可以读取字符并在HTML窗口中显示,但比较结果不起作用。 以下是我的代码,而里面的“displayContents()”函数的声明从文件中读取字符并使用javascript进行比较

if('c' == ch) 
    el.innerHTML = 'z'; 
else; 

始终是假的,即使文件“XYZ”只有“C”为内容。 当文件有'c'时,我期待'z'作为输出,否则就是浏览器窗口上的内容本身。 如何做到这一点,请指出我所做的一切都是错误的?

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8" /> 
     <title>Read File (via AJAX)</title> 
     <script type="text/javascript"> 
      var reader = new XMLHttpRequest() || new ActiveXObject('MSXML2.XMLHTTP'); 
      var el; 

      function loadFile() 
      { 
       reader.open('get', 'xyz', true); 
       reader.onreadystatechange = displayContents; 
       reader.send(null); 
      } 

      function displayContents() 
      { 
       if(reader.readyState == 4) 
       {      
       var el = document.getElementById('main');    
       ch = reader.responseText; 
       if('c' == ch) 
        el.innerHTML = 'z'; 
       else; 
        el.innerHTML = ch; 
       } 
      } 

      function delay_ms(delay) 
      { 
       var now = new Date(); 
       var desiredTime = new Date().setMilliseconds(now.getMilliseconds() + delay); 

       while (now < desiredTime) 
       { 
         now = new Date(); 
       } 
      } 
     </script> 
    </head> 

     <div id="main"></div> 

    <body onload = "loadFile();"></body> 
</html> 

回答

0

我不认为你的代码的工作原理 - 我试图运行它,并且无法使用XHR加载'xyz'。在Chrome中,我得到:

XMLHttpRequest cannot load file://localhost/Volumes/Macintosh%20HD/Users/ajhomer/Sites/readfile/xyz. Cross origin requests are only supported for HTTP. index.html:14 
Uncaught NetworkError: A network error occurred. 

但是,如果你得到它以某种方式工作,并想知道为什么你永远不会得到“Z”作为innerHTML的,这是因为分号否则后:

else; 

这就是说,我做了一个适用于Chrome的东西的小例子。

我假设你是通过文件协议加载页面,是这样的:

file://localhost/Volumes/HD1/Users/user/Sites/readfile/index.html 

我的版本使用动态脚本注入,而不是XHR,所以不是只写一个字符为“XYZ”,你必须写一些JavaScript调用 'displayContents',是这样的:HTML文件

var payload = 'c'; 
displayContents(payload); 

然后:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Read File (via dynamic script injection)</title> 
     <script type="text/javascript"> 

      function loadFile() 
      { 
       var scr = document.createElement('script'); 
       scr.onload = function(e) { 
        console.log(e); 
       }; 
       scr.onerror = function(e) { 
        console.log(e); 
       } 
       var cachebuster = Math.round(new Date().getTime()/1000); 
       scr.src = 'xyz.js?cb='+cachebuster; 
       document.head.appendChild(scr); 
      } 

      function displayContents(ch) 
      { 
       var el = document.getElementById('main'); 
       if('c' == ch) 
        el.innerHTML = 'z'; 
       else 
        el.innerHTML = ch; 
      } 

     </script> 
    </head> 

     <div id="main"></div> 

    <body onload = "loadFile();"></body> 
</html> 

这可以做得更优雅 - 这只是一个快速的POC。

+0

请告诉我,在将它与'c'比较之前,你在哪里初始化变量“ch”。 –

+0

加载'xyz'时,将评估脚本并调用displayContents,并将有效内容作为唯一参数传递。 ch将得到任何有效负载设置为:在例子中,我将它设置为'c'。让我知道你是否需要更多的澄清。 – ajh158

相关问题