Удаление отдельного конкретного пользовательского скрипта из WKUserContentController
Я использую addUserScript() для добавления пользовательского скрипта в WKUserContentController моего WKWebView. Я заметил, что даже если вызвать loadRequest(), сценарий остается.
В некоторых случаях мне может потребоваться удалить некоторые сценарии и добавить другие. Однако, похоже, что единственный способ удалить сценарии - это removeAllUserScripts(). Это очень неудобно, так как это означает, что мне придется удалить все сценарии, а затем повторно добавить те, которые я хотел сохранить.
Если кто-нибудь знает, как удалить конкретный скрипт (по имени, дескриптору и т. Д.), Пожалуйста, сообщите мне.
2 ответа
Я не думаю, что "удаление сценария" является чем-то возможным (или даже значимым, если я правильно понимаю ваш вопрос).
"Сценарий" - это просто текст, который используется для предоставления среде Javascript определений таких элементов, как переменные, функции и т. Д. Два сценария могут очень хорошо перекрывать друг друга (например, определять одну и ту же функцию foo ()), поэтому в зависимости от того, в каком порядке вы их загрузили, у вас будет другое конечное окружение (у вас есть только определение foo () последнего загруженного скрипта). Так что же означает "удалить сценарий" в этом случае?
Если вы действительно хотите избавиться от элементов вашей среды Javascript, вы всегда можете переопределить их так, чтобы они ничего не делали (например, переопределить foo () в {}). Но я думаю, что самый простой способ - просто больше не использовать foo ().
Вы можете попробовать что-то вроде этого:
-(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;
}