2012-07-30 3 views
1

자바 스크립트에서 배열을 처리하고 싶습니다. (즉, html 페이지에서 플러그인 코드까지, HTML 코드의 값을 플러그인의 변수로 가져 와서 코드 내에서 수정할 수 있고 다른 목적으로 처리 할 수 ​​있습니다.)npapi webkit 플러그인 배열 처리

하지만이 문제가 있습니다. 내부적으로 배열이 NPObject로 처리된다는 것을 알고 있습니다. 배열의 길이와 배열의 요소를이 NPObject에서 검색하려고하지만 배열의 길이가 0이 아니더라도 길이가 0이 아닌 것으로 생각됩니다. 내가 배열이있는 HTML 페이지를

어떤 제안은 환영 받다는 .... HTML 페이지는 다음과 같다 :

<html> 
<script type="text/javascript"> 
var arrayData = [9,1,2,3,4,5,6,7,8,9]; 
function handleEvent(e) { 
    if (e.keyCode == 55) { 
     document.getElementById('arrayint_ele_disp').innerHTML = arrayData; 
     process_intarray(arrayData); 
    } 
} 
function process_intarray(arrayData){ 
    obj = document.getElementById("Obj"); 
    if(obj){ 
     obj.process_array_intval(arrayData); 
    } 
} 
</script> 

<body onload="init()" onkeydown="handleEvent(event)"> 
<div id ="arrayint_ele_disp" style="position:absolute;left:100px;top:250px"> 
ARRAY_INT VAL </div> 
</body> 

</html> 

배열 요소를 처리하는 내 플러그인 코드가 folows과 같다 : 여기서

이 함수 NPN_GetProperty (m_npp, inobject, NPN_GetStringIdentifier ("길이") & npvlength)에
bool ScriptableObject::process_intarray(const NPVariant* args, uint32_t 
    argCount, NPVariant* result) 
{ 

    //Get the Length of the array 
    //NPObject *inobject = args[0].value.objectValue; 
    NPObject *inobject = args->value.objectValue; 

    bool bRetval = false; 
    NPVariant npvlength; 
    //NPIdentifier id; 

    bRetval = 
    NPN_GetProperty(m_npp,inobject,NPN_GetStringIdentifier("length"),&npvlength); 
    printf("\n NPN_GetProperty length type %d value : %d\n" 
    ,npvlength.type,npvlength.value.intValue); 

    //Get the array elements 
    int i = 0; 
    for(i = 0; i < npvlength.value.intValue; i++) 
    { 
     NPVariant CurVal; 
     NPN_GetProperty(m_npp,inobject,NPN_GetIntIdentifier(i),&CurVal); 
     m_prop_array_intval[i] = CurVal.value.intValue; 
    } 
    return true; 

} 

; 사실을 돌려주고있다.

하지만 NPVariantType_Double로 0을 입력하고 npvlength의 길이를 확인하는 중입니다. 나는

어떤 제안을 환영합니다 ...

답변

1

당신은 Int32 또는 Double 중 하나 인 숫자에 의존해서는 안 .. 이유를 이해 할 수없는입니다. 숫자 유형이 double이면 value.doubleValue을 사용하여 길이를 얻으십시오. 그렇지 않으면 valueunion이고 따라서 doubleValue 및 이 동일한 메모리를 참조하기 때문에 예기치 않은 값이 표시됩니다.
변환을 위해 도우미 함수를 작성하는 것이 이상적이므로 NPVariantType에 대해 걱정할 필요가 없습니다.

또한 NPIdentifier을 캐싱해야합니다. 최악의 경우 NPN_Get*Identifier()은 문자열 비교/해싱/비용을 제외하고 브라우저 프로세스와 플러그인 프로세스에서 전체 프로세스 간 왕복을 초래할 수 있습니다.

+0

안녕 조지, 제안 주셔서 감사 ... 나는 또한 npvlength.value.doubleValue 시도했지만 여전히 0입니다. 배열 요소는 정수이므로 npvlength.value.intValue를 사용하고 있습니다 ... 다른 제안 사항 ... – Techtotie

+0

@ user1523492 : 단지'printf()'명령문을 조정하여'% f '% d 대신'? –

+0

안녕하세요. 유감입니다. 작동합니다 ... 한 번 더 확인했습니다 .... 감사합니다 .-) – Techtotie