fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-29
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
15楼#
发布于:2023-04-13 16:17
taoww
(async function() {
  'use strict';
 
  let chapname...
回到原帖
完美的代码
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-29
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
16楼#
发布于:2023-04-13 16:17
taoww:抱歉,我上面把promise那套写错了。正确的是要把同步执行的放到同一个async函数里,我这里就把最外层的换了,差不多像这样
(async function() {
  'use strict';
 
  let chapname...
回到原帖
完美!!!  这样我原先的代码 就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,但是我感觉增加了 一项新的复制黏贴技能...惭愧^_^
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-05-21
  • 发帖数637
  • 经验583枚
  • 威望0点
  • 贡献值110点
  • 好评度106点
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}
  `;
 
})();
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-29
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
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}
  `;
  
})();
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-05-21
  • 发帖数637
  • 经验583枚
  • 威望0点
  • 贡献值110点
  • 好评度106点
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换个判断条件就是了
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-29
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
20楼#
发布于:2023-04-12 23:14
taoww:这本来就是一个异步机制。最简单的方式就是你把你的代码都放到x函数里的if后面,也就是确保章节内容加载后再去执行你的代码。
alert("这里写你获取内容前要做的事")
(function x() {
  if ($(".bookrea...
回到原帖
第一种通俗易懂我是明白的,但是我需要合并好几个网站,
就是
if 是1号网站 获取 书名 章节名称 正文内容
if 是2号网站 获取 书名 章节名称 正文内容
if 是3号网站 获取 书名 章节名称 正文内容
统一处理一下
最终重构一个简单的网页
document.body.innerHTML = ` <div>书名</div><div>章节名称</div><div>正文内容</div>`


所以需要第二种
第二种 代码似乎有些问题 我没有修改就是复制黏贴 ,无法获取到章节名称和文章内容
alert(chapname)    alert(chaptext) 都是空的 什么都没有显示
帮忙修正下吧 或者 我哪里搞错了...
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-05-21
  • 发帖数637
  • 经验583枚
  • 威望0点
  • 贡献值110点
  • 好评度106点
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)=&gt;{
    (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("这里写你获取内容后要做的事")
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-29
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
22楼#
发布于:2023-04-12 16:04
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() {
  if ($(".bookreadercontent").length == 0) {
    set...
回到原帖
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()...怎么搞下才行
fanta
火狐狸
火狐狸
  • UID30401
  • 注册日期2009-09-17
  • 最后登录2024-05-29
  • 发帖数236
  • 经验164枚
  • 威望0点
  • 贡献值114点
  • 好评度5点
  • 社区居民
  • 忠实会员
23楼#
发布于:2023-04-12 15:13
taoww:你要等它ajax加载完毕再读。用 MutationObserver 或者简单点上setTimeout(function x() {
  if ($(".bookreadercontent").length == 0) {
    set...
回到原帖
感谢帮助,我菜  MutationObserver 完全不知道怎么用
就用你这个~~~~我去捣鼓捣鼓
taoww
非常火狐
非常火狐
  • UID39284
  • 注册日期2013-03-18
  • 最后登录2024-05-21
  • 发帖数637
  • 经验583枚
  • 威望0点
  • 贡献值110点
  • 好评度106点
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);
})()
上一页 下一页
游客

返回顶部