#html #angularjs #node.js #single-page-application #w3.css
#HTML #angularjs #node.js #одностраничное приложение #w3.css
Вопрос:
У меня возникли проблемы с рендерингом CSS в клиентском приложении AngularJS, использующем NodeJS в качестве сервера. Весь приведенный ниже код предназначен для полного SPA (одностраничного приложения) и поддерживает компиляцию.
/*nodeJS: used to develop the server (server.js).*/
/*AngularJS: used to develop the HTML page (page.html).*/
/*w3 CSS: used as the custom CSS library.*/
Когда я ссылаюсь на файл .css с внешнего веб-сервера (онлайн), например,
<style href="http://css_source.com/version/file.css" rel="stylesheet"></style>
Страница отображается правильно со всем выполненным форматированием CSS. Но когда я ссылаюсь на файл .css из каталога моего приложения, например,
<style rel="stylesheet" href="css/file.css"></script>
он отображает HTML-страницу, но без форматирования CSS.
Кто-нибудь может мне помочь в этом вопросе, пожалуйста?
Пожалуйста, найдите структуру файла ниже и соответствующие коды для файла w3.css, server.js и page.html ниже.
Спасибо.
[СТРУКТУРА КАТАЛОГОВ]
NodeJS folder contains the following:
----server.js
----AngularJS folder
AngularJS folder contains the following:
----CSS folder
----js folder
----img folder
----page1.html
----page2.html
----page3.html
----mainpage.html
CSS folder contains the following:
----w3.css
js folder contains the following:
----angular.min.js
----angular-route.js
----angular-animate.js
img folder contains the following:
----img1.jpg
---img2.jpg
---img3.jpg
[КОНЕЦ СТРУКТУРЫ КАТАЛОГОВ]
[СЕРВЕР.JS-КОД]
var http = require('http');
var fs = require('fs');
var url = require('url');
// Create a server
http.createServer( function (request, response) {
// Parse the request containing file name
var pathname = url.parse(request.url).pathname;
// Print the name of the file for which request is made.
console.log("Request for " pathname " received.");
// Read the requested file content from file system
fs.readFile(pathname.substr(1), function (err, data) {
if (err) {
console.log(err);
// HTTP Status: 404 : NOT FOUND
// Content Type: text/plain
response.writeHead(404, {'Content-Type': 'text/html'});
}else {
//Page found
// HTTP Status: 200 : OK
// Content Type: text/plain
response.writeHead(200, {'Content-Type': 'text/html'});
// Write the content of the file to response body
response.write(data.toString());
}
// Send the response body
response.end();
});
}).listen(9800);
// Console will print the message
console.log('Server running at http://127.0.0.1:9800/');
[MAIN PAGE .HTML]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Easytime Calculator</title>
<script src="../angular.min.js"></script>
<script src="../angular-route.js"></script>
<link rel="stylesheet" href="css/w3.css">
/***...here if I reference the w3.css file from an external server, it renders perfectly with the css formatting**.*/
but when I reference the w3.css from within my app folder (angularJS/css/w3.css), it does not render the css formatting but the angularJS codes compile.
</head>
<body ng-app="myApp">
<div class="w3-card-24 w3-margin" style="max-width:720px; height:550px;">
<header class="w3-container w3-light-grey w3-padding-18">
<h2>Easytime Calculators</h2>
</header>
<ul class="w3-navbar w3-green">
<!--<p><a href="#/" class="">Calculators Page</a></p>
<a href="#page1" class="">Simple Calculator</a>
<a href="#page2" class="">Advanced Calculator 1</a>
<a href="#page3" class="">Advanced Calculator 2</a>-->
<li><a href="#/" onclick="openCalc('main')" class="w3-hover-red">Main Page</a></li>
<li><a href="#page1" onclick="openCalc('simp')" class="w3-hover-red">Simple Calculator</a></li>
<li><a href="#page2" onclick="openCalc('adv1')" class="w3-hover-red">Advanced Calculator 1</a></li>
<li><a href="#page3" onclick="openCalc('adv2')" class="w3-hover-red">Advanced Calculator 2</a></li>
</ul>
<hr style="width:100%; border-bottom-color:purple; border-style:solid;" />
<ng-view></ng-view>
<script>
var app = angular.module("myApp", ["ngRoute"]);
app.config(function($routeProvider) {
$routeProvider
.when("/", {
templateUrl : "mainpage.html",
})
.when("/page1", {
templateUrl : "page1.html",
})
.when("/page2", {
templateUrl : "page2.html",
})
.when("/page3", {
templateUrl : "page3.html",
});
});
app.controller("math1Ctrl", function ($scope) {
$scope.val1 = "";
$scope.val2 = "";
$scope.calculate = function() {
if(angular.equals($scope.selectedOperator, "-")){
$scope.result = ($scope.val1 - $scope.val2);
}
if(angular.equals($scope.selectedOperator, " ")){
$scope.result = ($scope.val1 $scope.val2);
}
if(angular.equals($scope.selectedOperator, "*")){
$scope.result = ($scope.val1 * $scope.val2);
}
if(angular.equals($scope.selectedOperator, "/")){
$scope.result = ($scope.val1 / $scope.val2);
}
/*if(angular.equals($scope.selectedOperator, "%")){
$scope.result = ($scope.val1 % $scope.val2);
}*/
if($scope.selectedOperator ==""){
scope.result = "Invalid operator - Please select an operator";
}
}//end the calculate function
});
app.controller("math2Ctrl", function ($scope) {
$scope.val1 = "";
$scope.val2 = "";
$scope.calculate = function() {
if(angular.equals($scope.selectedOperator, "^")){
$scope.result = ($scope.val1 ** $scope.val2);
}
if(angular.equals($scope.selectedOperator, "100%")){
$scope.result = (($scope.val1 /100)* $scope.val2);
}
if(angular.equals($scope.selectedOperator, "%")){
$scope.result = ($scope.val1 % $scope.val2);
}
if(angular.equals($scope.selectedOperator,"")){
scope.result = "Invalid operator - Please select an operator";
}
}//end the calculate function
});
app.controller("math3Ctrl", function ($scope) {
$scope.val1 = "";
//$scope.val2 = "";
$scope.showMe = true;
//check which operator is active and hide or show the textbox
$scope.myFunc = function() {
if (angular.equals($scope.selectedOperator, "")){
$scope.showMe = true;
$scope.sh = false; //hid or show the 'of' keyword beside the textbox
}else if(angular.equals($scope.selectedOperator, "sqrt")){
$scope.showMe = true;
$scope.sh = true; //hid or show the 'of' keyword beside the textbox
$scope.sel = true; //show the <p> element for the selected number
$scope.action = "Square the Root"; //change the value of the action button
$scope.msg = "";
}else if(angular.equals($scope.selectedOperator, "pi")){
$scope.showMe = false;
$scope.sh = false; //hid or show the 'of' keyword beside the textbox
$scope.val1 = ""; //reset the val1 variable to empty
$scope.sel = false; //hide the <p> element for selected number
$scope.action = "Get Value of PI"; //display a different text on the action button
$scope.msg = ""; //clear the msg variable
}
}// end the myFunc function
//calculate and display the value based on the selected operator
$scope.calculate = function() {
if(angular.equals($scope.selectedOperator, "sqrt")){
$scope.result = Math.sqrt($scope.val1);
$scope.msg = "The Square Root of " $scope.val1 " is: " $scope.resu<
if (angular.equals($scope.val1, "")){
$scope.msg = "Please select a number to square.";
}
}else if(angular.equals($scope.selectedOperator, "pi")){
$scope.x = 22;
$scope.y = 7;
$scope.result = ($scope.x / $scope.y);
$scope.msg = "The value of [Pi Ratio] is usually [22 / 7] = " $scope.resu<
}else{
$scope.result = "Invalid operator - Please select an operator";
}
}//end the calculate function
});
</script>
<script>
/* this script is used to create a navigation tab on the page
you can add more tabs by adding div blogs above.
*/
openCalc("main")
function openCalc(calcName) {
var i;
var x = document.getElementsByClassName("calc");
for (i = 0; i < x.length; i ) {
x[i].style.display = "none";
}
document.getElementById(calcName).style.display = "block";
}
</script>
</div>
</body>
</html>
[PAGE1 .HTML]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<div ng-controller="math1Ctrl" style="margin-left:35px;">
<h2 style="color:navy;">Simple Functions Calculator</h2>
<form name="maths" action="">
<div>
<label>Enter 1st Number : </label>
<input type="number" name="val1" ng-model="val1" required />
<span class="w3-padding-left w3-text-red" ng-show="maths.val1.$touched amp;amp; maths.val1.$invalid">value 1 must be a number and is required </span>
</div>
<p></p>
<div>
<label>Select Desired Operator : </label>
<select name="operator" ng-model="selectedOperator" nc-click="chkOperator()">
<option value=" " selected="selected">Addition</option>
<option value="-">Subtraction</option>
<option value="*">Multiplication</option>
<option value="/">Division</option>
</select>
</div>
<p></p>
<div>
<label>Enter 2nd Number : </label>
<input type="number" name="val2" ng-model="val2" required />
<span class="w3-padding-left w3-text-red" ng-show="maths.val2.$touched amp;amp; maths.val2.$invalid">value 2 must be a number and is required</span>
</div>
<p></p>
<div>
<!--<button ng-click="calculate()">Calculate</button>-->
<h3 class="w3-btn w3-padding w3-green" ng-click="calculate()">
Calculate
</h3>
</div>
</form>
<p>1st Number is: <span class="w3-padding-left w3-text-red">{{val1}}</span></p>
<p>2nd Number is: <span class="w3-padding-left w3-text-red">{{val2}}</span></p>
<h3 class="w3-padding-left w3-text-red">
Value 1
<span class="w3-padding-left w3-text-purple">[ {{selectedOperator}} ]</span>
Value 2
<span class="w3-padding-left w3-text-green">equals to: </span>
{{result}}
</h3>
</div>
</body>
</html>
[PAGE 2]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<div ng-controller="math2Ctrl" style="margin-left:35px;">
<h2 style="color:navy;">Advanced Calculator 1</h2>
<form name="maths" action="">
<div>
<label>Enter 1st Number : </label>
<input type="number" name="val1" ng-model="val1" required />
<span style="color:red;" ng-show="maths.val1.$touched amp;amp; maths.val1.$invalid">value 1 must be a number and is required </span>
</div>
<p></p>
<div>
<label>Select Desired Operator : </label>
<select name="operator" ng-model="selectedOperator" nc-click="chkOperator()">
<!--<option value=" " selected="selected">Addition</option>
<option value="sqrt">SQRT</option>-->
<option value="^">Exponent (power of)</option>
<option value="100%">Percent</option>
<option value="%">Modulus (remainder)</option>
</select>
</div>
<p></p>
<div>
<label>Enter 2nd Number : </label>
<input type="number" name="val2" ng-model="val2" required />
<span style="color:red;" ng-show="maths.val2.$touched amp;amp; maths.val2.$invalid">value 2 must be a number and is required</span>
</div>
<p></p>
<div>
<!--<button ng-click="calculate()">Calculate</button>-->
<h3 class="w3-btn w3-padding w3-green" ng-click="calculate()">Calculate</h3>
</div>
</form>
<p>1st Number is: <span class="w3-padding-left w3-text-red">{{val1}}</span></p>
<p>2nd Number is: <span class="w3-padding-left w3-text-red">{{val2}}</span></p>
<h3 class="w3-padding-left w3-text-red">
Value 1
<span class="w3-padding-left w3-text-purple">[ {{selectedOperator}} ]</span>
Value 2
<span class="w3-padding-left w3-text-green">equals to: </span>
{{result}}
</h3>
</div>
</body>
</html>
[PAGE3.HTML ]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>
<body>
<div ng-controller="math3Ctrl" style="margin-left:35px;">
<h2 style="color:navy;">Advanced Calculator 2</h2>
<form name="maths" action="">
<div>
<label>Select Desired Operator : </label>
<select name="operator" ng-model="selectedOperator" ng-change="myFunc()">
<option value="sqrt" selected="selected">SQRT</option>
<option value="pi">PI Ratio</option>
</select> <span ng-show="sh">Of</span>
</div>
<p></p>
<div ng-show="showMe">
<label>Enter a Number : </label>
<input type="number" name="val1" ng-model="val1" required />
<span class="w3-padding-left w3-text-red" ng-show="maths.val1.$touched amp;amp; maths.val1.$invalid">value 1 must be a number and is required </span>
</div>
<p></p>
<div>
<h3 class="w3-btn w3-padding w3-green" ng-click="calculate()">{{action}}</h3>
</div>
</form>
<p ng-show="sel">Selected Number is: <span style="color:red;">{{val1}}</span></p>
<h3 class="w3-padding-left w3-text-red">{{msg}} </h3>
</div>
</body>
</html>
[КОД W3.CSS]
/* W3.CSS 2.8 by Jan Egil and Borge Refsnes */
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
a{background-color:transparent;-webkit-text-decoration-skip:objects}
a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
dfn{font-style:italic}mark{background:#ff0;color:#000}
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}
img{border-style:none}svg:not(:root){overflow:hidden}
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}
hr{box-sizing:content-box;height:0;overflow:visible}
button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold}
button,input{overflow:visible}button,select{text-transform:none}
button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button}
button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner{border-style:none;padding:0}
button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring{outline:1px dotted ButtonText}
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
[type=checkbox],[type=radio]{padding:0}
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}
::-webkit-input-placeholder{color:inherit;opacity:0.54}
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
/* End extract */
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
h1,h2,h3,h4,h5,h6,.w3-slim,.w3-wide{font-family:"Segoe UI",Arial,sans-serif}
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
.w3-serif{font-family:"Times New Roman",Times,serif}
h1,h2,h3,h4,h5,h6{font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}
hr{border:0;border-top:1px solid #eee;margin:20px 0}
img{margin-bottom:-5px}a{color:inherit}
.w3-image{max-width:100%;height:auto}
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}
.w3-table-all{border:1px solid #ccc}
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}
.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
.w3-table-all tr:nth-child(odd){background-color:#fff}
.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}
.w3-centered tr th,.w3-centered tr td{text-align:center}
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
.w3-btn,.w3-btn-block{border:none;display:inline-block;outline:0;padding:6px 16px;vertical-align:middle;overflow:hidden;text-decoration:none!important;color:#fff;background-color:#000;text-align:center;cursor:pointer;white-space:nowrap}
.w3-btn:hover,.w3-btn-block:hover,.w3-btn-floating:hover,.w3-btn-floating-large:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
.w3-btn,.w3-btn-floating,.w3-btn-floating-large,.w3-closenav,.w3-opennav{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
* некоторый текст усечен *
Комментарии:
1. Можете ли вы предоставить ссылку на онлайн-версию всего этого?
2. Какой путь вы используете для доступа к своей странице? Почему ваши ссылки на angular используются
../
?3. Вы обслуживаете файл css из узла srver или получаете к нему доступ локально на клиенте?
4. Если вы посмотрите на структуру файла, папка CSS, содержащая файл w3.css, находится внутри <папки AngularJS>, а <папка AngularJS> находится внутри <папки NodeJS> . В <NodeJS fold> у меня есть server.js файл и в <папке AngularJS> у меня есть HTML-файлы.
Ответ №1:
в приведенном выше коде показано, что вы ссылаетесь на свой css следующим образом:
<style rel="stylesheet" href="css/file.css"></script>
Вы закрываете style
тег script
тегом
Комментарии:
1. Привет, спасибо за замечание. Но проблема не в этом. Ошибка, которую вы видели выше, — это опечатка, когда я печатал этот документ. Все равно спасибо.