12

IE をバージョン 10 から 11 にアップグレードしたところ、ActiveX カスタム イベントが機能しないことがわかりました。

その理由は、IE11 がサポートされattachEventなくなり、使用する必要があるようaddEventListenerです。たとえば、以前に使用した

obj.attachEvent("onSelected", method1); 

そして今、それは

obj.addEventListener("onSelected",method1,false); 

コードを変更した後、method1 をトリガーできません。ActiveX プラグインに実装されているカスタム イベントを JS メソッドにバインドし、IE11 で動作させる方法がわかりません。

4

4 に答える 4

13

IE 11 でこれまでに見つけた唯一の方法は、for...eventスクリプト ブロックを使用することです。

<script for="myActiveX" event="onSelected(param1, param2)">
  method1(param1, param2);
</script>
<object id="myActiveX" ...></object>

両方の要素は、JavaScript を使用して動的に作成することもできます。メソッドでfor属性を設定することだけを確認する必要があります。setAttribute

var handler = document.createElement("script");
handler.setAttribute("for", "myActiveX");
handler.event = "onSelected(param1, param2)";       
handler.appendChild(document.createTextNode("method1(param1, param2);"));
document.body.appendChild(handler);

var activeX = document.createElement("object");
activeX.id = "myActiveX"; 
activeX.codebase = "foobar.cab";
activeX.classid = "CLSID:123456789-1234-1234-1234-123456789012";
document.body.appendChild(activeX);

古いバージョンの IE (IE 8 以前) は、上記のコードが好きではありません。これらの古いブラウザーでは、メソッドでcodebaseパラメーターとforパラメーターを渡す必要があります。createElement

var handler = document.createElement('<script for="myActiveX">');
...
var activeX = document.createElement('<object classid="CLSID:123456789-1234-1234-1234-123456789012">');

新しいブラウザでは、このコードに遭遇すると例外がスローされるため、すべての IE バージョンをサポートするには、この例外をキャッチしてから他の方法を使用する必要があります。

于 2013-11-13T13:45:01.860 に答える
2

匿名関数で機能するように @Gerrit コードを変更します。また、単純に attachEvent 機能を IE 11 に追加します (テストはしていませんが、IE 以外のブラウザーの場合はポリフィルを追加します)。同じコードを使用できます。このページを見つけてよかったです。これを VBScript で行うか、古いバージョンの IE をエミュレートする必要があるのではないかと心配でした。

動作は IE5 までずっと同じようです。

ポリフィル

if (!window.attachEvent) {
  window.attachEvent = Element.prototype.attachEvent = function (ename, efunction) {
    if (typeof efunction !== '関数') {
      throw new TypeError('Element.prototype.attachEvent - 接続しようとしているものは呼び出し可能ではありません');
    }

    // どこかに追加する必要があります
    var _body = document.getElementsByTagName('body')[0];

    // IE のバージョンを取得
    var msie = (関数() {
        if (typeof document === "未定義") は false を返します。
        var v = 3、div = document.createElement('div')、a = div.all || [];

        while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]);

        var _detection = v > 4 ? v : /*@cc_on!@*/false;

        var _version = _detection === true ? 10 : (!(window.ActiveXObject) && "ActiveXObject" in window) === true ? 11 : _検出;

        _バージョンを返します。

    }());

    // ActiveX が機能しない問題を修正
    もし (msie == 11) {
      var _params = efunction.toString().match(/(\(.*\))\ *{/)[1];
      var _funcName = efunction.toString().match(/^関数\s?([^\s(]*)/)[1];
      var _fixAnon = false;

      // 無名関数を許可する
      if (_funcName == "") {
        _fixAnon = true;
        console.warn('関数名が見つかりません。自動生成');
        _funcName = "autogenFunction" + Math.floor(Math.random()*9999).toString()
        var _handleFunctionality = "{ var privateFunc = " + efunction.toString() + "; privateFunc.apply(" + _funcName + ", 引数); }";
      }

      // |event のスクリプトは 1 つだけ使用できます。まだ存在しないことを確認してください
      var _query = 'script[for=' + this.id + '][event=' + ename + ']';
      var _handle = document.querySelectorAll(_query);
      var _handleFunc = _funcName + _params + ';';

      もし (_fixAnon) {
        var _newFuncName = _funcName + _params;
        var _newFunction = "関数" + _newFuncName + "" + _handleFunctionality;
        var _newHandle = document.createElement('script');
        _newHandle.type = "テキスト/javascript";
        _newHandle.appendChild(document.createTextNode(_newFunction));
        _body.appendChild(_newHandle);
      }

      // スクリプト for|event が存在する場合は、それを再利用します
      if (_handle.length != 0) {
        _handleFunc += _handle[0].textContent;
        _body.removeChild(_handle[0]);
        _handle[0] を削除します。
      }
      _handle = document.createElement('スクリプト');
      _handle.setAttribute("for", this.id);
      _handle.event = ename;
      var _handleText = document.createTextNode(_handleFunc);
      _handle.appendChild(document.createTextNode(_handleFunc));
      _body.appendChild(_handle);
    }
    var _event = ename.substr(0,2) == "オン" ? ename.substr(2) : ename;

    // 非 IE ブラウザ用のポリフィル
    if (window.addEventListener) this.addEventListener(_event, efunction, false);
  }
}

私の ActiveX オブジェクトの使用例

<script type="text/javascript">
function MyObject_ObjectEvent() {
console.log('I am watching traditionally');
}
var _elem = document.getElementById('MyObject');
_elem.attachEvent('ObjectEvent', function () { console.log('I am watching anonymously') });
_elem.attachEvent('ObjectEvent', MyObject_ObjectEvent);
</script>
于 2014-10-17T16:40:43.807 に答える
1

kayahr の回答に基づいて、IE 11 でイベント登録を行う関数を作成しました。どうもありがとうございました! それは私のために働いた!

これが私のコードです(_functionCallbackパラメーターとして匿名関数では機能しません):

function AttachIE11Event(obj, _strEventId, _functionCallback) {
        var nameFromToStringRegex = /^function\s?([^\s(]*)/;
        var paramsFromToStringRegex = /\(\)|\(.+\)/;
        var params = _functionCallback.toString().match(paramsFromToStringRegex)[0];
        var functionName = _functionCallback.name || _functionCallback.toString().match(nameFromToStringRegex)[1];
        var handler;
        try {
            handler = document.createElement("script");
            handler.setAttribute("for", obj.id);
        }
        catch(ex) {
            handler = document.createElement('<script for="' + obj.id + '">');
        }
        handler.event = _strEventId + params;
        handler.appendChild(document.createTextNode(functionName + params + ";"));
        document.body.appendChild(handler);
    };

ブラウザのスニッフィングを使用する必要があり、コードは次のようにする必要があります

if(BrowserDetect.browser == "IE" && BrowserDetect.version >= 11)
   AttachIE11Event(obj, "onSelected", method1);
else if(obj.attachEvent)
   obj.attachEvent("onSelected", method1);
else if(obj.addEventListener)
   obj.addEventListener("onSelected", method1);
于 2013-11-26T10:21:56.980 に答える
-6

ActiveX は IE10 のブラウザーから削除されました。このテクノロジーは古く、HTML5 の世界ではますます不要になりました。

プラグインが何をしていたかについて言及していませんか?現在、標準コードに置き換えることはできますか?

于 2013-07-29T11:14:15.840 に答える