回应模式 - No.67024789


No.67024789 - 综合版1


X岛-EX网页端增强,移动端般的浏览体验No.67024789 只看PO

2025-09-15(一)09:17:34 ID:NMDJxCc 回应

X岛-EX:网页端增强,移动端般的浏览体验
0人瞩目0人期待的X岛-EX更新啦,前情提要:
>>No.66369234
如你所见,这是一个适配网页端[**X岛揭示板**](https://www.nmbxd1.com/)的油猴脚本,开发目的即为“增强网页端,赋予其移动端般的浏览体验”。
脚本下载链接:https://greasyfork.org/zh-CN/scripts/531005-x%E5%B2%9B-ex

Tips无名氏No.9999999

2099-01-01 00:00:01 ID: Tips

| ω・´) X岛除默认举报理由外没有自删功能。

无标题无名氏No.67334104

2025-10-31(五)19:40:37 ID: fSWxzzu

双倍颜文字的问题解决了!
赞美NMDJxCc
JP

无标题无名氏No.67335490

2025-10-31(五)23:02:40 ID: NMDJxCc (PO主)

>>No.67334104
啊,肥哥不是把颜文字光标位置插入先关掉了嘛( ゚∀。)前两天我先改了一下但还没发也不知道对不对>>No.67313272( ´_っ`)还加了一点新功能>>No.67316296,肥哥到时候再看看呢。

无标题无名氏No.67339184

2025-11-01(六)16:51:54 ID: fSWxzzu

>>No.67335490
是我水母了
( ゚∀。)
川川川

2.0.6更新快捷键新增+布局优化No.67350499

2025-11-03(一)09:42:03 ID: NMDJxCc (PO主)

2.0.6更新
优化 系统稳定性
修复 部分场景偶现异常问题

新增:
1.快捷键新增:
CTRL+enter全局唤出回复浮窗;
CTRL+\在回复浮窗中打开切饼选项,enter选择;
CTRL+/打开颜文字选择面板;
WASD/↑←↓→定位颜文字面板中位置,enter/空格选择。

修复:
1.*尝试*修复选择颜文字后实际输入两次的问题,修复效果待反馈。
2.修复2.0.5未生效的“为发送消息后的局部刷新添加末页检测,如果消息实际发送到新的页面,会同时无缝加载最新页”。
3.修复板块页无缝翻页后无法从串外点击收起长串的问题。
4.修复板块页内存在被关键词屏蔽回复的串未作用“收起板块页长串”功能的问题。

优化:
1.优化布局,限制消息容器在页面展示的宽度,避免因长链接导致消息溢出浏览器边界外。
2.优化原图与图片控件功能,跟随布局优化的修改同步限制原图展示宽度。
3.限制预览框中插入图片在未展开时显示的宽度。
4.使用esc关闭回复浮窗时,优先关闭颜文字面板,然后关闭回复浮窗。
5.消息内容为“0”时自动添加零宽空格以规避“没有上传文件的时候,必须填写内容”的发送错误。

无标题无名氏No.67374475

2025-11-06(四)20:59:01 ID: fSWxzzu

更新好耶
但双倍颜文字还是没有解决|ー` )
以及这个折叠侧边栏的判定框太小了,还是改大一点吧,至少要扩大到浏览器边缘
゚∀゚)σJP献上

无标题无名氏No.67374488

2025-11-06(四)21:01:09 ID: gcky0tX

(´゚Д゚`)bbbbbb

无标题无名氏No.67380565

2025-11-07(五)19:25:40 ID: NMDJxCc (PO主)

>>No.67374475
那双倍颜文字这个问题可能我不太能解决了(;´ヮ`)7肥哥可以试着把“initInsertAtCaret(); // 功能 1:颜文字插入光标处”这部分代码交给ai判断一下是可能什么情况,然后让他们修改一下试试,这样测试起来比较方便,如果有效的话可以发在串里我来更新一下。
侧边栏收起这部分是从肥哥代码里直接复制来的啦,触发区域默认宽度20px可能确实有点窄了,下版本i可以改成100来的。代码里triggerZone.style.width就是宽度的部分,100/150的触发位置大概是图里这样。

无标题无名氏No.67383244

2025-11-08(六)05:26:42 ID: fSWxzzu

AI改了一下就好了

function initInsertAtCaret() {
const SELECTOR = '#h-emot-select';
const TA_SELECTOR = 'textarea.h-post-form-textarea[name="content"]';

document.querySelectorAll(SELECTOR).forEach(select => {
if (select.dataset.kaoBound === '1') return;
select.dataset.kaoBound = '1';

const form = select.closest('form');
const textarea = form ? form.querySelector(TA_SELECTOR) : null;
if (!textarea) return;

let lastStart = 0;
let lastEnd = 0;

// 记录光标位置
const remember = () => {
lastStart = textarea.selectionStart ?? lastStart;
lastEnd = textarea.selectionEnd ?? lastEnd;
};

['keyup', 'mouseup', 'select', 'input', 'focus', 'blur'].forEach(ev =>
textarea.addEventListener(ev, remember, true)
);

// 只在 select 上监听 focus 相关事件来记录位置
['focus', 'mousedown'].forEach(ev =>
select.addEventListener(ev, remember, true)
);

// 防抖保护
let isInserting = false;

// 统一使用 input 事件来处理插入
select.addEventListener('input', function handleInsert(e) {
// 第一时间阻止所有传播
e.stopImmediatePropagation();
e.preventDefault();
e.stopPropagation();

// 防抖检查
if (isInserting) return;

const val = select.value;
if (!val) return;

isInserting = true;

insertAtCaret(textarea, val, lastStart, lastEnd);

// 延迟重置选择器和解除防抖
setTimeout(() => {
select.value = '';
isInserting = false;
}, 50);

textarea.focus();
}, true); // 捕获阶段

// 移除 change 事件的监听,避免重复触发
select.addEventListener('change', function(e) {
e.stopImmediatePropagation();
e.preventDefault();
e.stopPropagation();
}, true);

function insertAtCaret(textarea, text, selStart, selEnd) {
// 记录插入前的滚动位置
const prevScrollTop = textarea.scrollTop;

// 确定插入位置
let start = Number.isInteger(selStart) ? selStart : textarea.selectionStart;
let end = Number.isInteger(selEnd) ? selEnd : textarea.selectionEnd;
if (!Number.isInteger(start) || !Number.isInteger(end)) {
start = end = textarea.value.length;
}

// 拼接新内容
const before = textarea.value.slice(0, start);
const after = textarea.value.slice(end);
textarea.value = before + text + after;

// 插入后的光标位置
const newPos = start + text.length;

// 关键:重新 focus 并设置光标位置
textarea.focus();
textarea.setSelectionRange(newPos, newPos);

// 延迟触发 input 事件,避免与原生逻辑冲突
setTimeout(() => {
textarea.dispatchEvent(new Event('input', { bubbles: true }));
}, 0);

// 恢复滚动条位置
textarea.scrollTop = prevScrollTop;

// 更新记忆位置
lastStart = lastEnd = newPos;
}
});
}

无标题无名氏No.67383246

2025-11-08(六)05:29:13 ID: fSWxzzu

空格改成全角

function initInsertAtCaret() {
    const SELECTOR = '#h-emot-select';
    const TA_SELECTOR = 'textarea.h-post-form-textarea[name="content"]';

    document.querySelectorAll(SELECTOR).forEach(select => {
        if (select.dataset.kaoBound === '1') return;
        select.dataset.kaoBound = '1';

        const form = select.closest('form');
        const textarea = form ? form.querySelector(TA_SELECTOR) : null;
        if (!textarea) return;

        let lastStart = 0;
        let lastEnd = 0;

        // 记录光标位置
        const remember = () => {
            lastStart = textarea.selectionStart ?? lastStart;
            lastEnd = textarea.selectionEnd ?? lastEnd;
        };
        
        ['keyup', 'mouseup', 'select', 'input', 'focus', 'blur'].forEach(ev =>
            textarea.addEventListener(ev, remember, true)
        );
        
        // 只在 select 上监听 focus 相关事件来记录位置
        ['focus', 'mousedown'].forEach(ev =>
            select.addEventListener(ev, remember, true)
        );

        // 防抖保护
        let isInserting = false;

        // 统一使用 input 事件来处理插入
        select.addEventListener('input', function handleInsert(e) {
            // 第一时间阻止所有传播
            e.stopImmediatePropagation();
            e.preventDefault();
            e.stopPropagation();

            // 防抖检查
            if (isInserting) return;

            const val = select.value;
            if (!val) return;

            isInserting = true;

            insertAtCaret(textarea, val, lastStart, lastEnd);

            // 延迟重置选择器和解除防抖
            setTimeout(() => {
                select.value = '';
                isInserting = false;
            }, 50);

            textarea.focus();
        }, true); // 捕获阶段

        // 移除 change 事件的监听,避免重复触发
        select.addEventListener('change', function(e) {
            e.stopImmediatePropagation();
            e.preventDefault();
            e.stopPropagation();
        }, true);

        function insertAtCaret(textarea, text, selStart, selEnd) {
            // 记录插入前的滚动位置
            const prevScrollTop = textarea.scrollTop;

            // 确定插入位置
            let start = Number.isInteger(selStart) ? selStart : textarea.selectionStart;
            let end   = Number.isInteger(selEnd)   ? selEnd   : textarea.selectionEnd;
            if (!Number.isInteger(start) || !Number.isInteger(end)) {
                start = end = textarea.value.length;
            }

            // 拼接新内容
            const before = textarea.value.slice(0, start);
            const after  = textarea.value.slice(end);
            textarea.value = before + text + after;

            // 插入后的光标位置
            const newPos = start + text.length;

            // 关键:重新 focus 并设置光标位置
            textarea.focus();
            textarea.setSelectionRange(newPos, newPos);

            // 延迟触发 input 事件,避免与原生逻辑冲突
            setTimeout(() => {
                textarea.dispatchEvent(new Event('input', { bubbles: true }));
            }, 0);

            // 恢复滚动条位置
            textarea.scrollTop = prevScrollTop;

            // 更新记忆位置
            lastStart = lastEnd = newPos;
        }
    });
}