alert(line)alert'ac'和typeof(line)是'string',但charAt不是函数

时间:2010-03-06 16:51:14

标签: javascript firefox

警告(线路)警报'ac' typeof(line)是'string'

当我运行line.charAt(0)时,charAt不是一个函数 当行为“http://www.google.com/”时,它可以正常工作,

我认为这是我打开文件的UTF-8编码......

如何使用UTF-8工作?

更新:

http://mxr.mozilla.org/mozilla-central/source/netwerk/dns/src/effective_tld_names.dat?raw=1在我的扩展程序的chrome文件夹中为effective_tld_names.dat

运行代码:

authority = 'orkut.com.br';
lines = sc_geteffectivetldnames();  
lines = sc_preparetouse(lines);
domainname = sc_extractdomainname(authority, lines);

代码:

function sc_geteffectivetldnames () {
    var MY_ID = "my@email.com";
    var em = Components.classes["@mozilla.org/extensions/manager;1"].
             getService(Components.interfaces.nsIExtensionManager);
    var file = em.getInstallLocation(MY_ID).getItemFile(MY_ID, "chrome/effective_tld_names.dat");
    var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].
                            createInstance(Components.interfaces.nsIFileInputStream);
    istream.init(file, 0x01, 0444, 0);
    istream.QueryInterface(Components.interfaces.nsILineInputStream);
    var line = {}, lines = [], hasmore;
    do {
      hasmore = istream.readLine(line);
      lines.push(line.value); 
    } while(hasmore);
    istream.close();
    return lines;
}

function sc_preparetouse(lines) {
    lines = sc_notcomment(lines);
    lines = sc_notempty(lines);
    return lines;
}
function sc_notcomment(lines) {
    var line;
    var commentre;
    var matchedcomment;
    var replacedlines;
    replacedlines = new Array();
    var i = 0;
    while (i < lines.length) {
        line = lines[i];
        commentre = new RegExp("^//", 'i');
        matchedcomment = line.match(commentre);
        if(matchedcomment) {
            lines.splice(i, 1);
        } else {
            i++;
        }
    }
    return lines;
}
function sc_notempty(lines) {
    var line;
    var emptyre;
    var matchedempty;
    var replacedlines;
    replacedlines = new Array();
    var i = 0;
    while (i < lines.length) {
        line = lines[i];
        emptyre = new RegExp("^$", 'i');
        matchedempty = line.match(emptyre);
        if(matchedempty) {
            lines.splice(i, 1);
        } else {
            i++;
        }
    }
    return lines;
}
function sc_extractdomainname(authority, lines) {
    for (var i = 0; i < lines.length; i++) {
        line = lines[i];
        alert(line);
        alert(typeof(line));
        if (line.chatAt(0) == '*') {
            alert('test1');
            continue;
        }
        if (line.chatAt(0) == '!') {
            alert('test2');
            line.chatAt(0) = '';
        }
        alert('test3');
        checkline = sc_checknotasteriskline(authority, line);
        if (checkline) {
            domainname = checkline;
        }
    }
    if (!domainname) {
        for (var i = 0; i < lines.length; i++) {
            line = lines[i];
            alert(line);
            if (line.chatAt(0) != '*') {
                alert('test4');
                continue;
            }
            if (line.chatAt(0) == '!') {
                alert('test5');
                line.chatAt(0) = '';
            }
            alert('test6');
            checkline = sc_checkasteriskline(authority, line);
            if (checkline) {
                domainname = checkline;
            }
        }
    }
    return domainname;
}

警告'ac',然后'string',然后什么都没有。

更新:

我认为使用nsIExtensionManager和NSIIOService打开的文件之间存在差异,因为该实际代码不起作用,但此测试代码有效:

function makeURI(aURL, aOriginCharset, aBaseURI) {
  var ioService = Components.classes["@mozilla.org/network/io-service;1"]
                            .getService(Components.interfaces.nsIIOService);
  return ioService.newURI(aURL, aOriginCharset, aBaseURI);
}

URL = makeURI('file://C:/test/TLDs.dat');

// URL is a nsIURI; see nsIIOService::newURI for getting a string into a nsIURI.
var file = URL.QueryInterface(Components.interfaces.nsIFileURL).file;
// file is now a nsIFile

// open an input stream from file
var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].
                        createInstance(Components.interfaces.nsIFileInputStream);
istream.init(file, 0x01, 0444, 0);
istream.QueryInterface(Components.interfaces.nsILineInputStream);

// read lines into array
var line = {}, lines = [], hasmore;
do {
  hasmore = istream.readLine(line);
  lines.push(line.value); 
} while(hasmore);

istream.close();

// do something with read data

lines[0].charAt(0);

2 个答案:

答案 0 :(得分:1)

如果没有看到任何代码,很难分辨出发生了什么,但请记住,并非所有评估为字符串的属性都是字符串。一个很好的例子就是location object。单独使用对象将为您提供字符串值,但您不能使用该字符串值上的本机字符串可用的任何方法。

// Although `window.location` returns a string, you cannot use String methods on it
alert(window.location.charAt(0));       // error
alert(window.location.href.charAt(0));  // no error

外部接口提供的字符串也是如此,例如插件或ActiveX控件。解决此问题的方法是转换为本机字符串:

alert((""+window.location).charAt(0));        // auto casting with concatenation
alert(String(window.location).charAt(0));     // with the String() constructor
alert(window.location.toString().charAt(0));  // with toString()

至少前两个方法应解决您的问题(用您的var替换window.location)。如果没有,请尝试发布一些代码,以便我们更好地了解正在发生的事情。

<小时/> 看看你的代码,我只能假设我上面说的是正确的。 readLine方法返回一个line对象,该对象包含非本地字符串属性value(考虑到这是相当奇怪的)。我建议您编辑代码,如下所示:

function sc_geteffectivetldnames () {
    var MY_ID = "my@email.com";
    var em = Components.classes["@mozilla.org/extensions/manager;1"].
             getService(Components.interfaces.nsIExtensionManager);
    var file = em.getInstallLocation(MY_ID).getItemFile(MY_ID, "chrome/effective_tld_names.dat");
    var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].
                            createInstance(Components.interfaces.nsIFileInputStream);
    istream.init(file, 0x01, 0444, 0);
    istream.QueryInterface(Components.interfaces.nsILineInputStream);
    var line = {}, lines = [], hasmore;
    do {
      hasmore = istream.readLine(line);
      lines.push(String(line.value));     // <--- or ""+line.value
    } while(hasmore);
    istream.close();
    return lines;
}

答案 1 :(得分:0)

我在MDC中找到了Firefox for Parsing。

https://developer.mozilla.org/en/Code_snippets/URI_parsing

不知何故,它没有出现在谷歌上。