#javascript #ios #iphone #wkwebview #wkuserscript
#javascript #iOS #iPhone #wkwebview #wkuserscript
Вопрос:
Я использую addUserScript () для добавления пользовательского скрипта в WKUserContentController моего WKWebView. Я заметил, что даже при вызове loadRequest() скрипт остается неизменным.
Для определенных вариантов использования мне может потребоваться удалить определенные скрипты и добавить другие. Однако, похоже, что единственный способ удалить скрипты — это removeAllUserScripts(). Это очень неудобно, поскольку означает, что мне пришлось бы удалить все скрипты, а затем повторно добавить обратно те, которые я хотел сохранить.
Если кто-нибудь знает какой-либо способ удалить конкретный скрипт (по имени, дескриптору и т.д.), Пожалуйста, дайте мне знать.
Ответ №1:
Я не думаю, что «удаление скрипта» является чем-то возможным (или даже значимым, если я правильно понимаю ваш вопрос).
«Скрипт» — это просто текст, который используется для предоставления среде Javascript определений элементов, таких как переменные, функции и т.д… Два скрипта вполне могут переопределять друг друга (например, определять одну и ту же функцию foo()), поэтому в зависимости от порядка, в котором вы их загрузили, у вас будет другая конечная среда (у вас есть только определение foo () последнего загруженного скрипта). Итак, что бы означало «удалить скрипт» в этом случае?
Если вы действительно хотите избавиться от элементов вашей среды Javascript, вы всегда можете переопределить их на что-то, что ничего не делает (например, переопределите foo() на {}). Но я думаю, что самый простой способ — просто больше не использовать foo () .
Комментарии:
1. Это возможно. Apple уже предоставляет функцию для удаления всех пользовательских скриптов: removeAllUserScripts. Я пытаюсь сделать это для одного скрипта, чтобы не мешать другим скриптам, которые могли быть добавлены.
Ответ №2:
Вы можете попробовать что-то вроде этого:
-(bool)removeUserScriptByValue:(nonnull NSString*)scriptValue{
bool retVal = false;
NSMutableArray<WKUserScript*>* userscripts = [NSMutableArray arrayWithArray:self.configuration.userContentController.userScripts];
for(int i=0; i<userscripts.count; i ){
WKUserScript* userScript = [userscripts objectAtIndex:i];
if([userScript.source rangeOfString:scriptValue].location != NSNotFound){
retVal = true;
[userscripts removeObjectAtIndex:i];
break;
}
}
if(retVal){
[self.configuration.userContentController removeAllUserScripts];
for(WKUserScript* script in userscripts)
[self.configuration.userContentController addUserScript:script];
}
return retVal;
}