Mam trzy pliki bardzo prostej aplikacji kątowej js
index.html
<!DOCTYPE html>
<html ng-app="gemStore">
<head>
<script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.3.8/angular.min.js'></script>
<script type="text/javascript" src="app.js"></script>
</head>
<body ng-controller="StoreController as store">
<div class="list-group-item" ng-repeat="product in store.products">
<h3>{{product.name}} <em class="pull-right">{{product.price | currency}}</em></h3>
</div>
<product-color></product-color>
</body>
</html>
product-color.html
<div class="list-group-item">
<h3>Hello <em class="pull-right">Brother</em></h3>
</div>
app.js
(function() {
var app = angular.module('gemStore', []);
app.controller('StoreController', function($http){
this.products = gem;
}
);
app.directive('productColor', function() {
return {
restrict: 'E', //Element Directive
templateUrl: 'product-color.html'
};
}
);
var gem = [
{
name: "Shirt",
price: 23.11,
color: "Blue"
},
{
name: "Jeans",
price: 5.09,
color: "Red"
}
];
})();
Zacząłem otrzymywać ten błąd, gdy tylko wprowadziłem dołączenie pliku product-color.html przy użyciu dyrektywy niestandardowej o nazwie productColor:
XMLHttpRequest cannot load file:///C:/product-color.html. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource.
angular.js:11594 Error: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'file:///C:/product-color.html'.
Co może się nie udać? Czy problem dotyczy ścieżki produktu product-color.html?
Wszystkie moje trzy pliki znajdują się w tym samym folderze głównym C:/user/project/
javascript
html
angularjs
xmlhttprequest
user3422637
źródło
źródło
Odpowiedzi:
Ten błąd występuje, ponieważ właśnie otwierasz dokumenty html bezpośrednio z przeglądarki. Aby to naprawić, musisz udostępnić swój kod z serwera WWW i uzyskać do niego dostęp na hoście lokalnym. Jeśli masz konfigurację Apache, użyj jej do obsługi plików. Niektóre IDE mają wbudowane serwery internetowe, takie jak IDE JetBrains, Eclipse ...
Jeśli masz konfigurację Node.Js, możesz użyć serwera http . Po prostu biegnij
npm install http-server -g
i będziesz mógł go używać w terminalu jakhttp-server C:\location\to\app
.źródło
BARDZO PROSTA POPRAWKA
W terminalu
Teraz przejdź do localhost: 8000 w przeglądarce, a strona się wyświetli
źródło
python -m http.server
.Operacja nie jest dozwolona w Chrome. Możesz użyć serwera HTTP (Tomcat) lub zamiast tego użyć przeglądarki Firefox.
źródło
Mój problem został rozwiązany po prostu przez dodanie
http://
do mojego adresu URL. na przykład użyłemhttp://localhost:3000/movies
zamiastlocalhost:3000/movies
.źródło
Jeśli używasz tego w przeglądarce chrome / chromium (np. W Ubuntu 14.04), możesz użyć jednego z poniższych poleceń, aby rozwiązać ten problem.
ThinkPad-T430:~$ google-chrome --allow-file-access-from-files ThinkPad-T430:~$ google-chrome --allow-file-access-from-files fileName.html ThinkPad-T430:~$ chromium-browser --allow-file-access-from-files ThinkPad-T430:~$ chromium-browser --allow-file-access-from-files fileName.html
Umożliwi to załadowanie pliku w wersji chrome lub chromium. Jeśli musisz wykonać tę samą operację dla systemu Windows, możesz dodać ten przełącznik we właściwościach skrótu chrome lub uruchomić go
cmd
z flagą. Ta operacja nie jest domyślnie dozwolona w Chrome, Opera, Internet Explorer. Domyślnie działa tylko w przeglądarkach Firefox i Safari. Dlatego użycie tego polecenia pomoże ci.Alternatywnie możesz również hostować go na dowolnym serwerze internetowym (przykład: Tomcat-java, NodeJS-JS, Tornado-Python itp.) W oparciu o język, z którym czujesz się komfortowo. To zadziała z dowolnej przeglądarki.
źródło
Jeśli z jakiegoś powodu nie możesz mieć plików hostowanych z serwera internetowego i nadal potrzebujesz jakiegoś sposobu ładowania podrzędnych, możesz skorzystać z
ngTemplate
dyrektywy.W ten sposób możesz umieścić swoje znaczniki wewnątrz tagów skryptu w pliku index.html i nie musisz uwzględniać znaczników jako części samej dyrektywy.
Dodaj to do swojego index.html
<script type='text/ng-template' id='tpl-productColour'> <div class="list-group-item"> <h3>Hello <em class="pull-right">Brother</em></h3> </div> </script>
Następnie w swojej dyrektywie:
app.directive('productColor', function() { return { restrict: 'E', //Element Directive //template: 'tpl-productColour' templateUrl: 'tpl-productColour' }; } );
źródło
RootCause:
Protokół pliku nie obsługuje żądań między źródłami dla Chrome
Rozwiązanie 1:
użyj protokołu http zamiast pliku, co oznacza: skonfiguruj serwer http, taki jak apache lub nodejs + serwer http
Rozwiązanie 2:
Dodaj --allow-file-access-from-files po docelowym skrócie Chrome i otwórz nową instancję przeglądania za pomocą tego skrótu
Rozwiązanie 3:
zamiast tego użyj przeglądarki Firefox
źródło
npm install http-server -g
http-server . -o
źródło
Dodam, że można również użyć xampp, typu mamp i umieścić swój projekt w folderze htdocs, aby był dostępny na localhost
źródło
Jeśli masz już uruchomiony serwer, nie zapomnij użyć http: // w wywołaniu API. Może to spowodować poważne problemy.
źródło
Powód
Nie otwierasz strony za pośrednictwem serwera, takiego jak Apache, więc gdy przeglądarka próbuje uzyskać zasób, który uważa, że pochodzi z oddzielnej domeny, co jest niedozwolone. Chociaż niektóre przeglądarki na to pozwalają.
Rozwiązanie
Uruchom inetmgr i hostuj swoją stronę lokalnie i przeglądaj jako http: // localhost: numer portu / PageName.html lub przez serwer internetowy, taki jak Apache, nginx, node itp.
Alternatywnie użyj innej przeglądarki. Podczas bezpośredniego otwierania strony za pomocą przeglądarki Firefox i Safari nie pojawił się błąd. Występuje tylko dla Chrome i IE (xx).
Jeśli używasz edytorów kodu, takich jak Brackets, Sublime lub Notepad ++, te aplikacje automatycznie obsługują ten błąd.
źródło
Ten problem nie występuje w przeglądarkach Firefox i Safari. Upewnij się, że korzystasz z najnowszej wersji xml2json.js. Ponieważ napotkałem błąd parsera XML w IE. W Chrome najlepiej otworzyć go na serwerze takim jak Apache lub XAMPP.
źródło
istnieje rozszerzenie Chrome 200ok, to serwer WWW dla Chrome, po prostu dodaj to i wybierz folder
źródło
Musisz otworzyć chrome używając następującej flagi Idź do menu Uruchom i wpisz "chrome --disable-web-security --user-data-dir"
Upewnij się, że wszystkie wystąpienia chrome są zamknięte, zanim użyjesz flagi do otwarcia chrome. Zostanie wyświetlone ostrzeżenie dotyczące zabezpieczeń, które wskazuje, że mechanizm CORS jest włączony.
źródło
Dodanie do @Kirill Fuchs doskonałego rozwiązania i odpowiedź na wątpliwości @ StackUsera - podczas uruchamiania serwera http ustaw ścieżkę tylko do folderu aplikacji, NIE do strony html!
http-server C:\location\to\app
i dostępindex.html
doapp
folderuźródło
Przejdź do C: /user/project/index.html, otwórz go w programie Visual Studio 2017, plik> Wyświetl w przeglądarce lub naciśnij Ctrl + Shift + W
źródło
Miałem ten sam problem. po dodaniu poniższego kodu do mojego pliku app.js zostało to naprawione.
var cors = require('cors') app.use(cors());
źródło