转跳到内容

幽月零

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

    87,537
  • 加入

  • 最后访问

  • 赢得天数

    1

幽月零 发表的所有内容

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

重要消息

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