1

私は中国のインターネットユーザーです。私の国では、Google/Yahoo 検索エンジンが非常に不安定です。
Yahoo の検索結果のリンクをクリックすると、次のエラー ページが表示されることがよくあります。

ERROR
The requested URL could not be retrieved    
While trying to retrieve the URL: http://search.yahoo.com/r/_ylt=A0oGdUY7FbNQFQsA5rZXNyoA;_ylu=X3oDMTE0ODJ2YTduBHNlYwNzcgRwb3MDMQRjb2xvA3NrMQR2dGlkA1ZJUDA1MV83Ng--/SIG=11ac0sa5q/EXP=1353942459/**http%3a//www.google.com/

The following error was encountered:    
    Access Denied.    
    Access control configuration prevents your request from being allowed at this time. Please contact your service provider if you feel this is incorrect. 

Your cache administrator is noc_admin@163.com.
by DXT-GZ-APP02 

hrefリンクをクリックすると、yahoo が の値をdirtyhref自動的に変更することに気付きました。
しようとし$('a[id|=link]').unbind('click mousedown')ますが、うまくいきません。
ヤフーを止める方法は?


現在、私はこのFirefoxのグリースモンキーコードを使用しています:

// ==UserScript==
// @name        Clean URL
// @namespace   http://hjkl.me
// @include     https://www.google.com/search*
// @include     http://search.yahoo.com/search*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @version     1
// ==/UserScript==

// GOOGLE
$('h3.r>a').removeAttr('onmousedown');

// YAHOO
$('a[id|=link]').on('click', function(){
    var url = $(this).attr('dirtyhref').split('**')[1];
    url = decodeURIComponent(url);
    $(this).attr('href', url);  //<-- yahoo will change it back!
    window.open(url, '_blank');
    return false;
});

問題は、マウスの中クリック機能を使用できないことです。(静かにタブページを開く)

4

3 に答える 3

2

通常、人々は「良い」href値を悪い/追跡dirtyhref属性にコピーし、Yahoo に任せます。

最近では、両方の値をサニタイズするだけです。

これは、私にとってはうまくいくと思われるAJAX処理スクリプトです。

// ==UserScript==
// @name        Clean URL
// @namespace   http://hjkl.me
// @include     http://search.yahoo.com/search*
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// @version     1
// @grant       GM_addStyle
// ==/UserScript==
/*- The @grant directive is needed to work around a design change
    introduced in GM 1.0.   It restores the sandbox.
*/

// GOOGLE
$('h3.r>a').removeAttr('onmousedown');

// YAHOO
waitForKeyElements ("a[id|=link]", fixDirtyLinks);

function fixDirtyLinks (jNode) {
    var url = jNode.attr('dirtyhref').split('**');
    if (url.length > 1) {
        var goodURL = decodeURIComponent (url[1]);
        jNode.attr ('href', goodURL);
        jNode.attr ('dirtyhref', goodURL);
    }
}
于 2012-11-26T09:00:05.637 に答える
1

基本的に、あなたがする必要があるのはdirtyhref属性を削除することです。href汚れを防ぐために、 dirtyhrefYahoo!の機能の前に削除機能を実行する必要があります。これを行うには、マウスイベントでイベントキャプチャを使用します。

Operaで使用しているユーザーJSは次のとおりです。

Yahoo!を無効にする 検索の書き換え:

https://gist.github.com/XP1/5008515/

// ==UserScript==
// @name Disable Yahoo! Search rewrite
// @version 1.00
// @description Disables the rewrite of links in Yahoo! Search results.
// @namespace https://gist.github.com/XP1/5008515/
// @copyright 2013
// @author XP1
// @homepage https://github.com/XP1/
// @license Apache License, Version 2.0; http://www.apache.org/licenses/LICENSE-2.0
// @include http*://search.yahoo.*/search?*
// @include http*://*.search.yahoo.*/search?*
// ==/UserScript==

/*
 * Copyright 2013 XP1
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*jslint browser: true, vars: true, maxerr: 50, indent: 4 */
(function (window, MouseEvent, HTMLElement) {
    "use strict";

    function disableRewrite(event) {
        if (!(event instanceof MouseEvent)) {
            return;
        }

        var target = event.target;

        var current = null;
        for (current = target; current instanceof HTMLElement; current = current.parentNode) {
            if (current.hasAttribute("dirtyhref")) {
                current.removeAttribute("dirtyhref");
                return;
            }
        }
    }

    window.addEventListener("mousedown", disableRewrite, true);
    window.addEventListener("click", disableRewrite, true);
}(this, this.MouseEvent, this.HTMLElement));
于 2013-02-21T21:54:11.657 に答える
1

IE9+、Opera、および Firefox がDOMAttrModifiedイベントを定義します。残念ながら、Webkit の現在のバージョンでは、このイベントは定義されていません。

これにより、属性のいずれかが変更されるたびに、 のhref属性がa[id|=link]の値にオーバーライドされます。dirtyhref属性に現在の値を割り当てても、変更としてカウントされないことに注意してください。

$('a[id|=link]').on('DOMAttrModified', function(){
    $(this).attr("href", $(this).attr("dirtyhref"));
});

テスト: http://jsfiddle.net/ZzJae/

また、ページの読み込み時にリンクをオーバーライドする必要があります。

DOMNodeInserted新しいリンクが継続的に表示される可能性がある場合 (たとえば、AutoPager が存在する場合)、イベント委任をバインドして使用する必要がある場合もあります。$(document).on("DOM...", "a[id|=link]", handler)

IE9+、Chrome+Safari、および Firefox では が定義されていますDOMSubtreeModifiedが、Opera では定義されていません。Webkit サポートを追加する場合は、このイベントもリッスンする必要があります。

最終的な解決策のスケッチ (Firefox のみ):

(function(){
  function overrideOne(){
    var dirty = $(this).attr("dirtyhref");
    var clean = dirty.split("**")[1];
    $(this).attr("href", clean);
  }
  function overrideAll(){
    $("a[id|=link]").each(overrideOne)
  }

  $(document).on("ready DOMNodeInserted", overrideAll);
  $(document).on("DOMAttrChanged", "a[id|=link]", overrideOne);
  $(document).on("click", "a[id|=link]",function(){
     ...
  }
}
于 2012-11-26T08:41:09.023 に答える