转跳到内容

幽月零

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

    87,860
  • 加入

  • 最后访问

  • 赢得天数

    1

幽月零 发表的所有内容

  1. 此内容有访问限制,请到内容页面查看。
  2. 此内容有访问限制,请到内容页面查看。
  3. 此内容有访问限制,请到内容页面查看。
  4. 此内容有访问限制,请到内容页面查看。
  5. 此内容有访问限制,请到内容页面查看。
  6. 此内容有访问限制,请到内容页面查看。
  7. 竟然用我的招式來對付我,月醬不講武德
  8. 話說總感覺硬盤比之前貴了很多,雖然不太記得價格了,但上次去買的時候好像便宜不少 話說為什麼一些盤我自己香港ip被限了,反而我掛日本ip就下得很快
  9. 喵咪有玩過noita嗎,以前玩過好一陣子都沒玩明白
  10. 有壞人(蹲下
  11. 好過分…雖然想這樣說,但我也做過這種事
  12. 你聽聽不就好了
  13. 比起鐵錘更想要……咳咳
  14. 話說之前買了Tevi也還沒玩
  15. 沒有證據也是大騙子
  16. 什麼時候的事
  17. 我就說不超過200×200不應該會算這麼慢。一查發現是rm自己的判斷可否通行的function,平常普通地移動的話只需要判斷一格和單方向,它效率低點就低點,問題不大。但這種需要大量調用的情況下影響就大了
  18. 為了速度嘗試了分別從起點和終點一起尋路,結果是有些地方會斜着扭一下,雖然整體上影對路徑的影響不大,但不太好看。
  19. 反正應該很快就處理好了,果然自己再寫一個更省事。不過目前雖然能運作,但還有一些優化的問題需要處理
  20. 群裡拿的,別人說能走,但只能走一下
  21. 我裂開來,從別人那接了一個有問題的簡易4方向A*算法。依我說與其給這東西修bug還不如讓我重頭寫一個來得省事
  22. 光看標題可能會有點抽象。先說起因,最近看到了這個帖子,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也不行。瀏覽器基於安全性的考慮,只有來自同一個來源的時候它才會生效)
  23. 感受正義的鐵錘吧 是喵君的認知不夠
  24. 掛了幾天看還是有人下的,除了我下的那幾天有幾個人跟我一起卡進度,這幾天還有兩三個人從我這下了不少
  25. 簡單試了下,能用,但是不好用,用光標去選太麻煩,個人來講覺得不如直接用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, });
×
×
  • 新建...

重要消息

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