문제

이것은 대답에 대한 후속 조치입니다 여기.

웹 브라우저에서 JavaScript가 처리 해야하는 이벤트 ( "MSG"매개 변수가 포함 된 "미주당")를 제기하는 사용자 정의 ActiveX 컨트롤이 있습니다. 역사적으로 우리는 다음과 같은 IE 전용 구문을 사용하여 다른 프로젝트에서이를 달성 할 수있었습니다.

function MyControl::ReceiveMessage(msg)
{
   alert(msg);
}

그러나 컨트롤이 묻힌 레이아웃 내부에서 JavaScript는 컨트롤을 찾을 수 없습니다. 구체적으로, 우리가 이것을 일반 HTML 페이지에 넣으면 잘 작동하지만 ASPX 페이지에 넣는 경우 <Form> 태그, "myControl은 정의되지 않은"오류가 발생합니다. 다음에 대한 변형을 시도했습니다.

var GetControl = document.getElementById("MyControl");
function GetControl::ReceiveMessage(msg)
{
   alert(msg);
}

... 그러나 JavaScript 오류가 "GetControl은 정의되지 않았습니다"를 초래합니다.

ActiveX 컨트롤에서 전송되는 이벤트를 처리하는 올바른 방법은 무엇입니까? 지금 우리는이 일을 IE에서 일하는 데 관심이 있습니다. 이것은 우리가하는 일에 대한 맞춤형 ActiveX 컨트롤이어야합니다.

감사.

도움이 되었습니까?

해결책

다음 스크립트 블록 형식을 사용 하여이 작업을 수행 할 수 있었지만 이것이 최선의 방법인지 여전히 궁금합니다.

<script for="MyControl" event="ReceiveMessage(msg)">
    alert(msg);
</script>

다른 팁

나는 전에 내 응용 프로그램에서 ActiveX를 사용했습니다. 객체 태그를 ASP.NET 양식에 배치하고 다음 JavaScript가 저에게 작동합니다.

function onEventHandler(arg1, arg2){
    // do something
}

window.onload = function(){
    var yourActiveXObject = document.getElementById('YourObjectTagID');
    if(typeof(yourActiveXObject) === 'undefined' || yourActiveXObject === null){
        alert('Unable to load ActiveX');
        return;
    }

    // attach events
    var status = yourActiveXObject.attachEvent('EventName', onEventHandler);
}

좋아요,하지만 상속 된 USERCONTROL (ACTIONX)과 함께 C# (.NET 2.0)을 사용하는 경우 ... 작동하는 유일한 방법은 이벤트의 핸들러 기능을 "확장"하는 것입니다.http://www.codeproject.com/kb/dotnet/extend_events.aspx?display=print

Werner Willemsens 씨의 친구 인 위의 프로젝트 링크는 내 프로젝트를 저장했습니다. 그렇게하지 않으면 JavaScript는 이벤트 핸들러에 바인딩 할 수 없습니다.

그는 선택한 예로 인해 복잡한 방식으로 "확장"을 사용했지만 간단하게 만들면 핸들을 이벤트 자체에 직접 연결하면 작동합니다. C# ActiveX는 "ScriptCallbackObject"를 지원하여 이벤트를 아래와 같은 JavaScript 함수에 바인딩해야합니다.

  var clock = new ActiveXObject("Clocks.clock");
  var extendedClockEvents = clock.ExtendedClockEvents();
  // Here you assign (subscribe to) your callback method!
  extendedClockEvents.ScriptCallbackObject = clock_Callback; 
  ...
  function clock_Callback(time)
  {
    document.getElementById("text_tag").innerHTML = time;
  }

물론 IOBJECTSAFETE 및 다른 보안 자료를 구현하여 더 잘 작동하도록해야합니다.

페이지에 'myControl'이라는 ID가있는 ActiveX 요소가있는 경우 JavaScript 핸들러 구문이 다음과 같습니다.

function MyControl::ReceiveMessage(msg)
{
   alert(msg);
}

이 코드가 양식 태그 내에서 작동하는 것을 발견했습니다. 이 예에서 콜백은 JavaScript가 ActiveX Control에 전달한 함수 매개 변수이며 CallbackParam은 ActiveX Control 내에서 생성 된 콜백 이벤트의 매개 변수입니다. 이런 식으로 나는 별도의 이벤트 핸들러를 선언하지 않고 모든 유형의 이벤트에 대해 동일한 이벤트 핸들러를 사용합니다.

<object id="ActivexObject" name="ActivexObject" classid="clsid:15C5A3F3-F8F7-4d5e-B87E-5084CC98A25A"></object>

<script>
function document.ActivexObject::OnCallback(callback, callbackparam){
callback(callbackparam);
}
</script>

제 경우에는 ActiveX 컨트롤을 동적으로 만들고 이벤트를들을 수있는 방법이 필요했습니다. 나는 이런 일을 할 수 있었다.

//create the ActiveX
var ax = $("<object></object>", {
    classid: "clsid:" + clsid,
    codebase: install ? cabfile : undefined,
    width: 0,
    height: 0,
    id: '__ax_'+idIncrement++
})
.appendTo('#someHost');

그런 다음 이벤트에 대한 핸들러를 등록하십시오.

//this function registers an event listener for an ActiveX object (obviously for IE only)
//the this argument for the handler is the ActiveX object.
function registerAXEvent(control, name, handler) {
    control = jQuery(control);

    //can't use closures through the string due to the parameter renaming done by the JavaScript compressor
    //can't use jQuery.data() on ActiveX objects because it uses expando properties

    var id = control[0].id;

    var axe = registerAXEvent.axevents = registerAXEvent.axevents || {};
    axe[id] = axe[id] || {};
    axe[id][name] = handler;

    var script =
    "(function(){"+
    "var f=registerAXEvent.axevents['" + id + "']['" + name + "'],e=jQuery('#" + id + "');"+
    "function document." + id + "::" + name + "(){"+
        "f.apply(e,arguments);"+
    "}"+
    "})();";
    eval(script);
}

이 코드를 사용하면 클로저를 사용하고 Eval ()의 범위를 최소화 할 수 있습니다.

ActiveX Control <object> 요소는 이미 문서에 추가되어야합니다. 그렇지 않으면 IE는 요소를 찾지 못하며 스크립트 오류가 발생합니다.

ActiveX 컨트롤이 다른 이름이나 다른 범위로 노출되기 때문에 MyControl :: HeariveMessage 예제가 작동하지 않는다고 생각합니다.

getControl :: LeadiveMessage의 예제를 사용하면 GetControl 참조가 설정되기 전에 함수 정의가 구문 분석되고 있다고 생각하므로 유효한 객체를 참조하지 않으므로 함수를 객체에 바인딩 할 수 없습니다.

MS 스크립트 디버거를 사용하고 제어에 대한 기본 참조가 다른 이름 또는 다른 범위 (양식의 자식)에 존재하는지 확인 하여이 문제를 공격합니다. 컨트롤에 대한 올바른 참조를 결정할 수 있다면 MSDN 기사가 지정한 Automagic :: 메소드와 기능을 올바르게 바인딩 할 수 있어야합니다.

한 가지 더 생각하면, 참조는 ID가 아닌 개체의 이름을 기반으로 할 수 있으므로 둘 다 설정하십시오 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top