转跳到内容

幽月零

【会员】论坛元勋
  • 内容数

    87,874
  • 加入

  • 最后访问

  • 赢得天数

    1

幽月零 发表的所有内容

  1. 發現了看起來很眼熟但好像沒搭過話的人 說到底除非你大量製造垃圾回覆,不然我還沒什麼印象有人因為類似的理由在這個區吃過刀
  2. 此内容有访问限制,请到内容页面查看。
  3. 此内容有访问限制,请到内容页面查看。
  4. 此内容有访问限制,请到内容页面查看。
  5. 此内容有访问限制,请到内容页面查看。
  6. 此内容有访问限制,请到内容页面查看。
  7. 此内容有访问限制,请到内容页面查看。
  8. 此内容有访问限制,请到内容页面查看。
  9. 此内容有访问限制,请到内容页面查看。
  10. 此内容有访问限制,请到内容页面查看。
  11. 此内容有访问限制,请到内容页面查看。
  12. 此内容有访问限制,请到内容页面查看。
  13. 此内容有访问限制,请到内容页面查看。
  14. 此内容有访问限制,请到内容页面查看。
  15. 竟然用我的招式來對付我,月醬不講武德
  16. 喵咪有玩過noita嗎,以前玩過好一陣子都沒玩明白
  17. 話說之前買了Tevi也還沒玩
  18. 沒有證據也是大騙子
  19. 光看標題可能會有點抽象。先說起因,最近看到了這個帖子,https://sstm.moe/topic/358822-不用打开检查界面就通过外链插入音视频控件的脚本直接获取全民k歌电脑网页音频源文件的脚本(基于tampermonkey插件)/,所以去找了下可以準確地將元素插入到相應的編輯框的方法,然後就發現了這個 首先看下圖,隨便找個回覆點修改,可以看到在 CKEDITOR.instances 中有兩個object,帶有id的是最底下新回覆的,先不用管它。comment_value 則是修改回覆用的編輯框。 這時候在"其他媒體" >> "插入外部圖片"中輸入鏈接可以正常插入圖片,到這裡都沒有問題。 但假如在保持之前的修改編輯器存在的情況下再打開另一個,可以看到CKEDITOR.instances 中仍然只有兩個object 這時在任意的修改框裡插入圖片,圖都會出現在最後打開的那一個裡面 問題講完了,再說說原因,首先可以看到這個編輯框是基於CKEditor的,在創建的時候會調用CKEDITOR.add,在CKEDITOR.instances[b.name] = b; 這裡用name 作為key把editor寫入到CKEDITOR.instances裡面(也就是一開始展示的那個)。 但是所有的修改框都叫comment_value,所以在CKEDITOR.instances中只能找到最後創建的那一個。 CKEDITOR.add = function(b) { function h() { CKEDITOR.currentInstance == b && (CKEDITOR.currentInstance = null, CKEDITOR.fire("currentInstance")) } CKEDITOR.instances[b.name] = b; b.on("focus", function() { CKEDITOR.currentInstance != b && (CKEDITOR.currentInstance = b, CKEDITOR.fire("currentInstance")) }); b.on("blur", h); b.on("destroy", h); CKEDITOR.fire("instance", null, b) } 其二就是在插入圖片時也是在CKEDITOR.instances裡面去找的,可以看var editor = CKEDITOR.instances[$(this.scope).data('editorid')]; 這一句,最終導致在同時存在多個修改框時,只會找到最後創建的那一個 insertLink: function(e) { var url = this.scope.find('[data-role="linkURL"]').val().replace(/'/g, '%27').replace(/"/g, '%22').replace(/</g, '%3C').replace(/>/g, '%3E'); if (!url) { $(this.scope).find('.ipsFieldRow.ipsFieldRow_fullWidth').addClass('ipsFieldRow_error'); return; } else { $(this.scope).find('.ipsFieldRow.ipsFieldRow_fullWidth').removeClass('ipsFieldRow_error'); } $(this.scope).find('.elLinkError').remove(); if (!url.match(/^[a-z]+\:\/\//i) && !url.match(/^mailto\:/i) && !url.match(/^\#/)) { url = 'http://' + url.replace(/^\/*/, ''); } var editor = CKEDITOR.instances[$(this.scope).data('editorid')]; var selection = editor.getSelection(); if (!_.isUndefined(editor._linkBookmarks)) { selection.selectBookmarks(editor._linkBookmarks); delete editor._linkBookmarks; } var selectedElement = selection.getSelectedElement(); if (selectedElement && selectedElement.is('img')) { var selectedElement = $(selection.getSelectedElement().$); if (!selectedElement.parent().is('a')) { var element = CKEDITOR.dom.element.createFromHtml("<a href='" + url + "'>" + selectedElement[0].outerHTML + "</a>"); editor.insertElement(element); } else { selectedElement.parent().attr('href', url).removeAttr('data-cke-saved-href'); } this.scope.find('input.cEditorURL').val(''); this.trigger('closeDialog'); } else if (selectedElement && (selectedElement.is('a') && $(selection.getSelectedElement().$).children().is('img'))) { selectedElement.setAttribute('href', url).removeAttribute('data-cke-saved-href'); this.scope.find('input.cEditorURL').val(''); this.trigger('closeDialog'); } else { if ($(this.scope).data('image')) { this.scope.find('[data-role="linkURL"]').addClass('ipsField_loading'); this.scope.find('[data-action="linkButton"]').prop('disabled', true); var scope = this.scope; var self = this; var img = new Image(); img.onerror = function () { scope.find('[data-role="linkURL"]').removeClass('ipsField_loading'); scope.find('[data-action="linkButton"]').prop('disabled', false); scope.find('.ipsFieldRow.ipsFieldRow_fullWidth').addClass('ipsFieldRow_error'); } ; img.onload = function () { var ajaxUrl = editor.config.controller + '&do=validateLink' if ($(this.scope).attr('data-image')) { ajaxUrl += '&image=1'; } ips.getAjax()(ajaxUrl, { data: { url: url, width: img.width, height: img.height, image: 1 }, type: 'post' }).done(function (response) { if (response.embed) { scope.find('[data-role="linkURL"]').removeClass('ipsField_loading'); scope.find('[data-action="linkButton"]').prop('disabled', false); scope.find('input.cEditorURL').val(''); editor.insertHtml(response.preview); self.trigger('closeDialog'); } else { scope.find('[data-role="linkURL"]').removeClass('ipsField_loading'); scope.find('[data-action="linkButton"]').prop('disabled', false); scope.find('.ipsFieldRow.ipsFieldRow_fullWidth').addClass('ipsFieldRow_error'); if (!_.isUndefined(response.errorMessage)) { scope.find('.ipsFieldRow.ipsFieldRow_fullWidth').append("<span class='elLinkError ipsType_warning'>" + response.errorMessage + "</span>"); } } }).fail(function () { scope.find('[data-role="linkURL"]').removeClass('ipsField_loading'); scope.find('[data-action="linkButton"]').prop('disabled', false); scope.find('.ipsFieldRow.ipsFieldRow_fullWidth').addClass('ipsFieldRow_error'); }); } img.src = url; } else { if (this.scope.find('[data-role="linkText"]').length) { var title = this.scope.find('[data-role="linkText"]').val().replace(/ {2}/g, ' &nbsp;'); if (!title) { title = decodeURI(url); } title = title.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); var element = CKEDITOR.dom.element.createFromHtml("<a>" + title + "</a>"); } else { element = selectedElement; } element.setAttribute('href', url); editor.insertElement(element); this.scope.find('input.cEditorURL').val(''); this.trigger('closeDialog'); } } } 我無法保證這裡說的東西完全正確,但是有打斷點檢查過,應該大致上是對的…吧? 順帶一提,如果你想寫腳本確實有需要用到這個editor,除了在CKEDITOR.instances裡面找,在這個div身上也可以拿到 順便再吐槽一下論壇的附件,我忍這東西很久了。直接點擊進行下載的時候不會指定文件名稱(明明在頁面上就有顯示文件名)。而且有些類型的文件不會直接下載,而是會跳轉到新頁面直接顯示(就算加了download attribute也不行。瀏覽器基於安全性的考慮,只有來自同一個來源的時候它才會生效)
  20. 簡單試了下,能用,但是不好用,用光標去選太麻煩,個人來講覺得不如直接用prompt彈個窗口給用戶輸入,醜是比較醜,但是簡單有效 文件類型的話,在headers裡面的Content-Type也可以用,比如你的 https://files.catbox.moe/nuj2cy.mp3,可以很清楚看到audio/mpeg,又比如m4a就是audio/x-m4a(音頻應詃都是audio開頭,視頻是video。不過這玩意是對面給的回應,對方不按標準來你也拿他沒辦法×) m4a 至於怎麼獲取,用XMLHttpRequest是一種方法,你喜歡的話像fetch api也可以 再補充一下,你把選項加入的操作寫在輸入框的click event裡面,但是這個輸入框不是在所有情況下都處於未展開的狀態的,最簡單的方法就是點開它發後嘗試發送一條空回覆,或者直接點修改,你會發現選項沒有被加上去 再再補充,因為很麻煩,還是覺得Mutation observer更好使,這玩意實現起來省事還通用。至於ui你就自己想辦法吧 (×) @367ddd const observer = new MutationObserver(function (mutations) { mutations.forEach((record) => { if (!record.addedNodes.length) return; for (const node of record.addedNodes) { if (node.tagName?.toLowerCase() === 'ul' && ['ipsMenu','ipsMenu_auto','ipsHide'].every(attr => node.classList.contains(attr))) { const ipsMenuItem = document.createElement('li'); ipsMenuItem.classList.add('ipsMenu_item'); const link = document.createElement('a'); link.href = '#'; link.textContent = 'Test'; ipsMenuItem.appendChild(link); node.appendChild(ipsMenuItem); } } }); }); observer.observe(document.querySelector('body'), { childList: true, });
  21. 最初用的那種12鍵的壓根就沒什麼東西可以玩,記得就是玩玩貪吃蛇之類的,還有一個控制一個球在那邊跳,勉強算是橫版跳躍類的吧。用了很久,之後用的就是智能機了,那時候倒是有找到過一個印象裡我很喜歡的遊戲,不過完全找不到了
  22. 沒有那麼誇張啦
  23. 已經沒有那種欲望了
  24. 以前看過漫畫版的,動畫還沒看
  25. 新番我已經好久沒看過了
×
×
  • 新建...

重要消息

为使您更好地使用该站点,请仔细阅读以下内容: 使用条款