为什么这段 js 出不了我想要的结果呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
starvedcat
V2EX    Javascript

为什么这段 js 出不了我想要的结果呢?

  •  
  •   starvedcat 2016 年 10 月 17 日 4003 次点击
    这是一个创建于 3373 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在需要用 js 处理一段以字符串形式输入的 html 。我发现下面这段程序无法打印出我要的结果,研究了好久实在看不出哪里有问题,特来求助!

    <html> <head> <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script> </head> <body> <script> var str = '<html><head></head><body><h1 id="myclass">content</h1></body></html>'; var doc = $.parseHTML(str); var title = $(doc).find('#myclass'); alert($(title).html()); </script> </body> </html> 
    </html>
    27 条回复    2016-10-17 11:35:39 +08:00
    starvedcat
        1
    starvedcat  
    OP
       2016 年 10 月 17 日
    就是先 parseHTML ,然后 find id 为 myclass 的元素(就是那个<h1>),但是为什么提示 undefined 呢?
    murmur
        2
    murmur  
       2016 年 10 月 17 日
    有问题么 整个代码里没看到 title 元素 当然是 undefined 了
    就算是也是$("title") 只有 document 用的不是引号的
    FelixXie
        3
    FelixXie  
       2016 年 10 月 17 日
    $(document)?
    LimboRunner
        4
    LimboRunner  
       2016 年 10 月 17 日
    doc 就是 #myclass
    finian
        5
    finian  
       2016 年 10 月 17 日
    调试一下不就知道了么
    cismous
        6
    cismous  
       2016 年 10 月 17 日   1
    id="myclass" 外面再包裹一层 div
    starvedcat
        7
    starvedcat  
    OP
       2016 年 10 月 17 日
    @cismous …………………………………………谢谢!可是,这是为什么,是不是没有<div>就找不到了??
    starvedcat
        8
    starvedcat  
    OP
       2016 年 10 月 17 日
    感谢 cismous 的回复,把上面代码<h1>外面再加一层<div>之后这段代码就可以正常 alert 出 title 了。所以现在我又有新的疑问了:这是为什么??
    iyangyuan
        9
    iyangyuan  
       2016 年 10 月 17 日 via iPhone   3
    原因是 jquery 从 body 的直接子元素开始解析,所以 h1 是顶级节点,自己 find 自己,当然 find 不到
    murmur
        10
    murmur  
       2016 年 10 月 17 日   1
    @starvedcat 因为 parse 后的结果就是<h1 id="myclass">content</h1>
    其余的标签被去掉了
    murmur
        11
    murmur  
       2016 年 10 月 17 日
    @iyangyuan 这句话求出处,官方文档我刚才查了他是调用的"native method"去做的解析,所以跟 jq 无关,问题出在 parse 那句,单独用 jquery 操作 body html header 里的东西都是没问题的
    zeusLeeJh
        12
    zeusLeeJh  
       2016 年 10 月 17 日
    打印一下 str 的值在 parse 后的变化嘛。你会发现只有 h1 标签,那么你怎么 find 出来呢
    loading
        13
    loading  
       2016 年 10 月 17 日 via Android   1
    楼主可以看看 alert($(doc).html)
    maijiawei
        15
    maijiawei  
       2016 年 10 月 17 日   1
    console.log($(str).find('#myclass').html());
    kingze1992
        16
    kingze1992  
       2016 年 10 月 17 日   1
    我建议楼主先把 html 基础和 jQuery 基础看一看吧。
    第一,调试的时候,你先用 console.log()把变量输出到控制台看一看,比如这个例子里 console.log(title)的结果为 [], console.log(doc)的结果才是 h1 元素。
    第二, jQuery 的 find(selector): Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element.
    其中 descendant 的意思是 后代,子孙,你在 h1#myclass 元素里,用.find()查找后代中 id 为 myclass 的元素,当然找不到。

    再次建议:找本书把基础学一学。
    FrankFang128
        17
    FrankFang128  
       2016 年 10 月 17 日
    parseHTML 用错了
    liuyanjun0826
        18
    liuyanjun0826  
       2016 年 10 月 17 日
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>ppi</title>
    </head>
    <body>
    <script>
    function ppicomputing() {
    var height = document.getElementById('height').value;
    var width = document.getElementById('width').value;
    var diagOnal= document.getElementById('diagonal').value;
    var ppi= (Math.sqrt(height * height + width * width)) / diagonal;
    var ppivalue = document.getElementById('ppivalue');
    document.getElementById("ppivalue").value = ppi.toString().substr(0,4);
    }
    </script>
    height<br>
    <input type="text" id="height">height<br>
    width<br>
    <input type="text" id="width">width<br>
    diagonal<br>
    <input type="text" id="diagonal">diagonal<br>
    ppi<br>
    <input type="text" id="ppivalue"><br>
    <button Onclick="ppicomputing()">computing</button>
    </body>
    </html>
    kingze1992
        19
    kingze1992  
       2016 年 10 月 17 日
    还有,如果自己练习的时候,需要引用库文件,比如 jquery.min.js , jquery.js ,建议从官网上下载下来,然后在本地引用,不然每次打开浏览器调试的时候,都要多等几秒钟(可能是我网络不好),不着急吗?
    zhenjiachen
        20
    zhenjiachen  
       2016 年 10 月 17 日
    `
    var str = '<html><head></head><body><h1 id="myclass">content</h1></body></html>';
    var doc = $.parseHTML(str);
    var $title = $(doc).find('#myclass');
    alert($title.html());
    `
    murmur
        21
    murmur  
       2016 年 10 月 17 日
    @kingze1992 这我感觉反倒是个好习惯,对于 jquery 这种超大众库以后肯定是蹭 cdn 的,哪里有用自己流量刷静态资源的
    kingze1992
        22
    kingze1992  
       2016 年 10 月 17 日
    @murmur 自己平时练习没必要用 cdn 吧?我打开的时候要等三秒左右加载,影响个人心情。
    tonghuashuai
        23
    tonghuashuai  
       2016 年 10 月 17 日
    <html>
    <head>
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    </head>
    <body>
    <script>
    var str = '<html><head></head><body><h1 id="myclass">content</h1></body></html>';
    var doc = $.parseHTML(str);
    var title = doc.find('#myclass');
    alert(title.html());
    </script>
    </body>

    </html>


    看第 9 、 10 行, doc 和 title 已经是变量(看前面的 var ),直接用就可以,$(doc) 这种用法感觉你 jQuery 用混乱了,建议先写原生 js ,明白其中的原理以后再用框架。


    现在大量使用 jQuery ,导致很多新手只知道 $('#id') 而不知道 document.getElementById('id')。
    quxiangxuanqxx
        24
    quxiangxuanqxx  
       2016 年 10 月 17 日
    @murmur 开发环境和生产环境不一样啊,这并不是一个好习惯。
    murmur
        25
    murmur  
       2016 年 10 月 17 日
    @quxiangxuanqxx
    开发系统和生产环境当然越接近越好 最多域名、硬件配置不一样
    以前是一个网站全相对资源,现在是几乎所有的东西都在别的服务器上,图片有图床,静态有 cdn ,数据源有一些服务器,然后一个登录还要给所有的域名上 cookie ,如果开发的时候图省事全放一个服务器上,等真拆分了有些本来早就应该发现的问题就暴露出来了
    其实很多大的类库都有在线的 cdn 地址给你用
    quxiangxuanqxx
        26
    quxiangxuanqxx  
       2016 年 10 月 17 日
    @murmur 配置一下呀,上线自动切换成生产环境, dev 环境是可以设置的。这是比较基础的知识吧
    starvedcat
        27
    starvedcat  
    OP
       2016 年 10 月 17 日
    @kingze1992 谢谢,我在本地的确是下载下来调试的,发到 V2EX 上的时候改成 CDN 了。。。。:)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2862 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:30 PVG 22:30 LAX 06:30 JFK 09:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86