15楼#
发布于:2023-04-13 16:17
|
|
16楼#
发布于:2023-04-13 16:17
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样完美!!! 这样我原先的代码 就99.999%都不用动了,感谢费时费力多番修改~ 从结果来看,就是第一行 (function() { 变成 (async function() { 然后增加新代码 等待载入, 其它照旧,perfect await new Promise((resolve,reject)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); });虽然 完全不懂 async await promise,但是我感觉增加了 一项新的复制黏贴技能...惭愧^_^ |
|
17楼#
发布于:2023-04-13 14:43
抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样
(async function() { 'use strict'; let chapname, bookname; if (location.hostname == "chuangshi.qq.com") { await new Promise((resolve,reject)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); }); chapname = $('h1[data-node="chapterTitle"]').text(); bookname = $(".bookNav").contents().eq(6).text(); } else if (location.hostname == "aaaa.com") { bookname = $("xxx").text(); chapname = $("yyy").text(); } document.body.innerHTML = ` ${bookname} ${chapname} `; })(); |
|
18楼#
发布于:2023-04-13 12:17
taoww:你能用第二种方式,那就也能用第一种方式。两者在执行上是等价的,最多就是第一种可能会写出多重嵌套的函数不太好看而已。而且按你的需求,也碰不上多重嵌套,直接用一个函数来作最终处理就行了if (location.hostname == "a.co...回到原帖谢谢,这样把后面所有内容变成一个函数确实可以 但是第二种似乎不是概率事件,无限循环无法跳出,我弄了个test变量,他就不停地++,无法获取正确的章节名称 我不会换正确的if条件...,还是希望这个第二种能够实现,我好像进死胡同了 // ==UserScript== // @name test // @version 0.01 // @description test // @match https://chuangshi.qq.com/* // @require https://code.jquery.com/jquery-3.6.1.min.js // ==/UserScript== /* globals jQuery, $, waitForKeyElements */ (function() { 'use strict'; let test=1; async function waitChapter() { await new Promise((resolve)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { console.log(test++) setTimeout(x, 100); return; } resolve(); })(); }); } waitChapter(); let chapname = $('h1[data-node="chapterTitle"]').text(); alert(chapname); let bookname = $(".bookNav").contents().eq(6).text(); document.body.innerHTML = ` ${bookname} ${chapname} `; })(); |
|
19楼#
发布于:2023-04-13 10:41
你能用第二种方式,那就也能用第一种方式。两者在执行上是等价的,最多就是第一种可能会写出多重嵌套的函数不太好看而已。而且按你的需求,也碰不上多重嵌套,直接用一个函数来作最终处理就行了
if (location.hostname == "a.com") { (function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } let chapname = $('h1[data-node="chapterTitle"]').text(); let chaptext = $('.bookreadercontent').text(); process(chapname, chaptext); })(); } else if (location.hostname == "b.com") { let chapname = $('xxxx').text(); let chaptext = $('yyyy').text(); process(chapname, chaptext); } function process(chapname, chaptext) { alert(chapname) alert(chaptext) alert("这里写你获取内容后要做的事") } 如果用第二种获取不了,第一种也一样会发生同样情况的,这种事只是个概率问题,都是刚好碰上创建了.bookreadercontent还没有往里面填内容。你if换个判断条件就是了 |
|
20楼#
发布于:2023-04-12 23:14
taoww:这本来就是一个异步机制。最简单的方式就是你把你的代码都放到x函数里的if后面,也就是确保章节内容加载后再去执行你的代码。第一种通俗易懂我是明白的,但是我需要合并好几个网站, 就是 if 是1号网站 获取 书名 章节名称 正文内容 if 是2号网站 获取 书名 章节名称 正文内容 if 是3号网站 获取 书名 章节名称 正文内容 统一处理一下 最终重构一个简单的网页 document.body.innerHTML = ` <div>书名</div><div>章节名称</div><div>正文内容</div>` 所以需要第二种 第二种 代码似乎有些问题 我没有修改就是复制黏贴 ,无法获取到章节名称和文章内容 alert(chapname) alert(chaptext) 都是空的 什么都没有显示 帮忙修正下吧 或者 我哪里搞错了... |
|
21楼#
发布于:2023-04-12 20:34
这本来就是一个异步机制。最简单的方式就是你把你的代码都放到x函数里的if后面,也就是确保章节内容加载后再去执行你的代码。
alert("这里写你获取内容前要做的事") (function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } alert("把你获取内容前要做的事放这里也行") let chapname = $('h1[data-node="chapterTitle"]').text(); let chaptext = $('.bookreadercontent').text(); alert(chapname) alert(chaptext) alert("这里写你获取内容后要做的事") })()会玩promise/async/await那套高级语法的,也可以把异步转成同步 async function waitChapter() { await new Promise((resolve)=>{ (function x(){ if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } resolve(); })(); }); } alert("这里写你获取内容前要做的事") waitChapter(); let chapname = $('h1[data-node="chapterTitle"]').text(); let chaptext = $('.bookreadercontent').text(); alert(chapname) alert(chaptext) alert("这里写你获取内容后要做的事") |
|
22楼#
发布于:2023-04-12 16:04
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() { var chapname="abc"; (function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } chapname = $('h1[data-node="chapterTitle"]').text(); alert(chapname); console.log(chapname+"这的代码怎么是最后运行啊") })() console.log(chapname+"这是后面的代码怎么先运行啊,我想后运行啊")我不会弄这个执行顺序,我想通过函数得到chapname等,然后后续进行一些处理, 可是好像是后面的代码都执行完了才运行function x()...怎么搞下才行 |
|
23楼#
发布于:2023-04-12 15:13
|
|
24楼#
发布于:2023-04-12 09:57
你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout
(function x() { if ($(".bookreadercontent").length == 0) { setTimeout(x, 100); return; } let chapname = $('h1[data-node="chapterTitle"]').text(); let chaptext = $('.bookreadercontent').text(); alert(chapname); alert(chaptext); })() |
|
上一页
下一页