0

我在 JavaScript 和 HTML 方面只有两天大。我使用 C 代码创建了一个命名管道,并且能够将字符写入其中。命名管道显示为名为“xyz”的文件。现在我正在尝试使用 HTML + JavaScript 读取这个文件,并访问这些字符。我想检查该命名管道文件上是否出现字符“c”。我现在正在使用来自 Ubuntu 终端的 echo 命令写入“xyz”。我能够读取字符并在 HTML 窗口上显示,但比较不起作用。以下是我的代码,在“displayContents()”函数中的语句

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>
4

1 回答 1

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后面的分号:

else;

话虽这么说,我做了一个在 chrome 中工作的小例子。

我假设您正在通过文件协议加载页面,例如:

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

我的版本使用动态脚本注入而不是 XHR,因此您必须编写一个调用 'displayContents' 的小 javascript,而不是仅将单个字符写入“xyz”,例如:

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

然后对于html文件:

<!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。

于 2013-10-22T13:18:00.523 回答