我正在编写一个 chrome 扩展,它可以帮助用户在 Twitter 上输入内容。当在 twitter 上写推文时,twitter 会打开一个可编辑的 div 容器。当用户输入内容时,twitter(可能正在使用某些网络框架)会生成子 div 并使用用户输入的文本跨度,并将它们放置在内容可编辑的 div 中。
问题是,当手动更改跨度值(例如,通过检查元素),然后再次键入某些内容时,跨度中的值将恢复为之前的值(在检查元素编辑之前)。这可能是因为实际输入的字符串存储在 javascript 中的某个位置,当用户输入 div 时,所有内容都会被再次覆盖。
我一直在尝试使用 JQuery 找到解决此问题的方法,但没有成功。我真的不知道如何开始。如果它只是一个常规的输入标签,您可以调用类似$("input").val("new value"), easy-peasy... 的内容,但我不知道如何为可编辑的 div 执行此操作,该 div 通过在页面上某处运行的 javascript 进行更新。
有一段时间,我只是觉得这是不可能的......
但现在我知道这是可能的。如果您下载 Grammarly 扩展并使用 Grammarly 弹出编辑器(打开一个新窗口来编辑文本),然后提交,twitter 可编辑内容 div 会相应更新,一切都会像魔术一样工作。
抱歉,如果这不是标准编程问题,但我在网上找不到任何与我想做的事情接近的内容。也许我只是经验不足,错过了一些非常明显的东西。我尝试查看 twitter 和 Grammarly 源代码,但都是缩小的乱码 JavaScript,我无法阅读......
感谢您的任何帮助和见解!
编辑:有问题的 Twitter 网址是:https://twitter.com/compose/tweet有问题的 div 是具有contenteditable="true"属性的 div(您可以在检查器中搜索它)
我刚刚更新到 chrome 76 stable,并尝试使用新的剪贴板 API 将一些文本(以及稍后的图像)复制到剪贴板。但是,navigator.clipboard.write(data)似乎不起作用。这是我的代码:
setInterval(function() {
console.log("Wriing to clipbard");
navigator.permissions.query({ name: 'clipboard-write' }).then(result => {
if (result.state === 'granted') {
var data = new Blob(["Text data"], {type : "text/plain"});
navigator.clipboard.write(data).then(function() {
console.log("Copied to clipboard successfully!");
}, function(error) {
console.error("unable to write to clipboard. Error:");
console.log(error);
});
} else {
console.log("clipboard-permissoin not granted: " + result);
}
});
}, 3000);
Run Code Online (Sandbox Code Playgroud)
我在 Chrome 扩展内容脚本中运行它,并设置了剪贴板权限,因此确实获得了权限。抛出的错误是:
unable to write to clipboard. Error:
TypeError: Failed to execute 'write' on 'Clipboard': Iterator …Run Code Online (Sandbox Code Playgroud) 我正在开发一个基本的引导加载程序,它通过 BIOSINT 13h AH=02h中断将辅助引导加载程序读入内存。我已经在模拟器(Virtualbox、Qemu 和 Bochs)中运行了它。
随后,我在我的引导加载程序中添加了一个 BPB(BIOS 参数块),制作了一个可引导的 USB,并在我的真机上使用 USB Floppy Emulation(我在真机 BIOS 的配置屏幕中设置)进行了测试。它就像一个魅力。
在我自己的机器上测试引导加载程序后,我在另一台较新的机器上测试了它。这台新计算机的 BIOS 配置中没有软盘仿真选项,因此无法从 USB 驱动器启动。因此,在这个osdev wikipage 之后,我在 MBR 的末尾添加了一个分区表,以便较新的机器可以从 USB 启动。
使用添加的分区表代码,引导加载程序无法将辅助引导加载程序加载到内存中,并且 BIOSINT 13h失败。我不知道为什么会发生这种情况,因为我没有更改任何实际的引导加载程序代码。我刚刚添加了 64 位 MBR 分区表,将数据读入内存立即失败。
bits 16
org 0x7C00
jmp start
nop
;------------------------------------------;
; Standard BIOS Parameter Block, "BPB". ;
;------------------------------------------;
bpbOEM db 'MSDOS5.0'
bpbSectSize dw 512
bpbClustSize db 1
bpbReservedSe dw 1
bpbFats db 2
bpbRootSize dw 224
bpbTotalSect dw 2880 …Run Code Online (Sandbox Code Playgroud) 给定一个8位整数'c8',必须将位模式复制到32位整数'c32',这样'c32'由重复4次的'c8'组成.例如,
if c8 = 1000 1110,
then c32 = 1000 1110 1000 1110 1000 1110 1000 1110
Run Code Online (Sandbox Code Playgroud)
我已经考虑过这个并在C中提出了两种方法.但是,我不是那么经验,而且我不确定哪种方法,如果有的话,我应该在最终的代码中使用.
最小例子:
uint8_t c8 = 0b10001110; // for this example
// method 1
uint32_t c32 = ((c8 << 8 | c8) << 16) | (c8 << 8 | c8);
// method 2
uint16_t c16 = c8 << 8 | c8;
uint32_t _c32 = c16 << 16 | c16;
Run Code Online (Sandbox Code Playgroud)
这两种方法都按预期工作,但我想知道哪一种从专家的角度来看会更好":-).
在第一种方法中,我正在计算多个班次,而在第二个方法中,我正在创建一个额外的变量.我不是那种经验不足的低级事物(以及这些低级事物的表现),如果有人能指出我正确的方向,或者找到更好的方法,我会很感激.
谢谢.
我正在尝试学习一些汇编,并且我从将文本输出到屏幕开始。我开始认为这可能是我的环境和/或编译的问题:到目前为止,我非常沮丧,我实际上已经复制粘贴了汇编代码,但它只是不会调用系统调用。这是源代码(主要改编自https://en.wikibooks.org/wiki/X86_Assembly/Interface_with_Linux)
.section .data
msg: .ascii "Hello World\n"
.section .text
.global main
main:
movq $1, %rdi # write to stdout
movq $msg, %rsi # use string "Hello World"
movq $12, %rdx # write 12 characters
syscall # make syscall
movq $60, %rax # use the _exit syscall
movq $0, %rdi # error code 0
syscall # make syscall
Run Code Online (Sandbox Code Playgroud)
我在运行 Kali Linux 的 64 位机器上,并使用 GCC 进行编译。就像这样:
gcc -c test.s
gcc test.o -no-pie
Run Code Online (Sandbox Code Playgroud)
我已经用 GDB 调试了程序,系统调用指令总是将 eax 寄存器设置为 0xffffffffffffffda (-38),这似乎不正确...... …
assembly ×2
javascript ×2
bios ×1
bootloader ×1
c ×1
clipboard ×1
html ×1
jquery ×1
linux ×1
mbr ×1
navigator ×1
system-calls ×1
twitter ×1
x86-16 ×1